「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
题目描述
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
- 第一行由字符
"qwertyuiop"组成。 - 第二行由字符
"asdfghjkl"组成。 - 第三行由字符
"zxcvbnm"组成。
示例1 :
输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
示例2 :
输入:words = ["omk"]
输出:[]
示例3 :
输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
解法1:哈希表
分析:通过一个哈希表,存储三个字符串
- "qwertyuiopQWERTYUIOP"的value值为1
- "asdfghjklASDFGHJKL"的value值为2
- "zxcvbnmZXCVBNM"的value值为3
遍历给定数组,先取字符串的第一个值为num,是1、2、3其中一个,进入遍历只要有一个不等于num,立即退出,继续遍历下一个字符串
class Solution {
//判断字符串中的所有字符在hash表的值是否相同
private boolean check(String word,int[] map){
int pre = map[Character.toLowerCase(word.charAt(0)) - 'a'];
for(int i = 1;i < word.length();i++){
if(map[Character.toLowerCase(word.charAt(i)) - 'a'] != pre)
return false;
}
return true;
}
public String[] findWords(String[] words) {
//手动打表
int[] map = {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> ans = new ArrayList<>();
for(String word : words){
if(check(word,map)){
ans.add(word);
}
}
return ans.toArray(new String[0]);
}
}
解法2:暴力查找
分析:先判断首字母处于键盘哪行 在详细针对三种情况做循环判断 一旦发现与首字母行数不同 自动执行下一个循环 只有执行到最后的第二层循环才能添加单词到ArrayList中 最后将Arraylist转换成数组输出
class Solution {
public String[] findWords(String[] words) {
String r1 = "qwertyuiop";
String r2 = "asdfghjkl";
String r3 = "zxcvbnm";
List<String> res = new ArrayList<>();
for (String word : words) {
String wordLow = word.toLowerCase();
boolean sameRow = true;
int row = -1;
if (r1.contains(String.valueOf(wordLow.charAt(0))))
row = 1;
else if (r2.contains(String.valueOf(wordLow.charAt(0))))
row = 2;
else
row = 3;
for (int i = 1; i < wordLow.length(); i++) {
if ((row==1&&!r1.contains(String.valueOf(wordLow.charAt(i)))) || (row==2&&!r2.contains(String.valueOf(wordLow.charAt(i)))) || (row==3&&!r3.contains(String.valueOf(wordLow.charAt(i))))) {
sameRow = false;
break;
}
}
if (sameRow) {
res.add(word);
}
}
return (String[])res.toArray(new String[res.size()]);
}
}