1204. 键盘的一行
给定一个单词列表,返回可以在美国键盘的一行上使用字母表键入的单词,如下图所示。
样例
输入: ["Hello", "Alaska", "Dad", "Peace"]
输出: ["Alaska", "Dad"]
注意事项
您可以多次使用键盘中的一个字符。
您可以假设输入字符串仅包含字母表的字母。
public class Solution {
/**
* @param words: a list of strings
* @return: return a list of strings
*/
public String[] findWords(String[] words) {
// write your code here
// 做出每一行
Set<Character> row1 = new HashSet<>();
row1.add('Q');row1.add('W');row1.add('E');
row1.add('R');row1.add('T');row1.add('Y');
row1.add('U');row1.add('I');row1.add('O');row1.add('P');
Set<Character> row2 = new HashSet<>();
row2.add('A');row2.add('S');row2.add('D');
row2.add('F');row2.add('G');row2.add('H');
row2.add('J');row2.add('K');row2.add('L');
Set<Character> row3 = new HashSet<>();
row3.add('Z');row3.add('X');row3.add('C');
row3.add('V');row3.add('B');row3.add('N');row3.add('M');
// 行号和行的map
Map<Integer, Set<Character>> map = new HashMap<>();
map.put(1, row1);
map.put(2, row2);
map.put(3, row3);
// 字母和行号的map
int[] rowMap = new int[] {2,3,3,2,1,2,2,2,1,2,2,2,3,3,1,1,1,1,2,1,1,3,1,3,1,3};
List<String> ls = new ArrayList<>();
for (String word : words) {
// 根据第一个字母找出行
Set<Character> row = map.get(rowMap[Character.toLowerCase(word.charAt(0)) - 'a']);
boolean isValid = true;
for (char c : word.toCharArray()) {
if (!row.contains(Character.toUpperCase(c))) {
isValid = false;
break;
}
}
if (isValid) {
ls.add(word);
}
}
String[] arr = new String[ls.size()];
for (int i = 0; i < ls.size(); i++) {
arr[i] = ls.get(i);
}
return arr;
}
}