给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
示例 1: 输入:words = ["Hello","Alaska","Dad","Peace"] 输出:["Alaska","Dad"] 示例 2: 输入:words = ["omk"] 输出:[] 示例 3: 输入:words = ["adsdf","sfd"] 输出:["adsdf","sfd"]思路
简单模拟 + 哈希表 + 标记法
- 设置行号0, 1,2,将每行的字符与所在行号做映射关系。
- 对单词中的每个字符,查看行号是否都是同一个数字。
- 考虑到有重复的,可以在判断是否同一个时用set去重。
class Solution {
public String[] findWords(String[] words) {
String[] rows = new String[]{
"qwertyuiop",
"asdfghjkl",
"zxcvbnm"
};
Map map = new HashMap<>();
//每个字符与所在行号做映射关系
for (int i = 0; i < 3; i ++ ) {
for (char c: rows[i].toCharArray()) {
map.put(c, i);
}
}
List res = new ArrayList<>();
for (String word: words) {
//每行的判断都需要一个set去重
Set set = new HashSet<>();
for (char c: word.toLowerCase().toCharArray()) {
set.add(map.get(c));
}
//set有去重,如果都是同一行,就只有一个数
if (set.size() == 1) res.add(word);
}
return res.toArray(new String[res.size()]);
}
}



