思路:
(1)用Map存储字母到所在行的映射。
(2)变量words,对每一个单词,先做小写字母转换存入word,再对word的每个字母进行遍历。用flag标记是否是第一个字母,用row存储第一个字母所在的行,对后续的字母,判断其所在行是否等于row,若不是,直接跳出内层循环继续判断下一个单词。考虑到数组需要预先设置长度,而数组长度未知,所以判断整个单词完毕后将其县存入List,最后再把List的元素存入结果数组。
public class Solution {
public String[] findWords(String[] words) {
int length = words.length;
List<String> results = new ArrayList<String>();
char[] row1 = new char[]{'q','w','e','r','t','y','u','i','o','p'};
char[] row2 = new char[]{'a','s','d','f','g','h','j','k','l'};
char[] row3 = new char[]{'z','x','c','v','b','n','m'};
Map<Character, Integer>map = new HashMap<Character, Integer>();
for (int i = 0; i < 10; i++)
map.put(row1[i], 1);
for (int i = 0; i < 9; i++)
map.put(row2[i], 2);
for (int i = 0; i < 7; i++)
map.put(row3[i], 3);
int row = 0;
for (int i = 0; i < length; i++) {
String word = words[i].toLowerCase();
int len = word.length(), j = 0, flag = 0;
for (; j < len; j++) {
if (flag == 0) {
row = map.get(word.charAt(j));
flag = 1;
}
else {
if (map.get(word.charAt(j)) != row) {
break;
}
}
}
if (j == len)
results.add(words[i]);
}
int size = results.size();
String[] result = new String[size];
for (int i = 0; i < size; i++)
result[i] = results.get(i);
return result;
}
}
Runtime:4ms