LeetCode500-键盘行

题目链接

英文链接:https://leetcode.com/problems/keyboard-row/

中文链接:https://leetcode-cn.com/problems/keyboard-row/

题目详述

给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。

American keyboard

示例:

1
2
输入: ["Hello", "Alaska", "Dad", "Peace"]
输出: ["Alaska", "Dad"]

注意:

  1. 你可以重复使用键盘上同一字符。
  2. 你可以假设输入的字符串将只包含字母。

题目详解

  • 对于键盘同一行上的字母,可以把它映射到同一个数;不同行上的字母映射到不同的数。这样比较字母是否在同一行就转化为了比较映射后的数是否相同。
  • 遍历字符串数组,对于每一个字符串,用首字符代表它所在的行,之后判断是否存在不同行的字符。若不存在,添加到结果集中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class LeetCode_00500 {

public String[] findWords(String[] words) {
List<String> res = new ArrayList<>();
int[] keyboard = new int[]{
1, 2, 2, 1, 0, 1, 1, // A,B,C,D,E,F,G
1, 0, 1, 1, 1, 2, 2, // H,I,J,K,L,M,N
0, 0, 0, 0, 1, 0, // O,P,Q,R,S,T
0, 2, 0, 2, 0, 2 // U,V,W,X,Y,Z
};
for (String word : words) {
if (inOneLine(word, keyboard)) {
res.add(word);
}
}
return res.toArray(new String[0]);
}

private boolean inOneLine(String word, int[] keyboard) {
int line = keyboard[Character.toUpperCase(word.charAt(0)) - 'A'];
for (int i = 1; i < word.length(); ++i) {
if (keyboard[Character.toUpperCase(word.charAt(i)) - 'A'] != line) {
return false;
}
}
return true;
}
}