原文链接:500. 键盘行 - 力扣(LeetCode)
题目
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。
示例 1:
输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
示例 2:
输入:words = ["omk"]
输出:[]
示例 3:
输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
提示:
1 <= words.length <= 20
1 <= words[i].length <= 100
words[i] 由英文字母(小写和大写字母)组成
题解
方法一:函数调用
解题思路
1、以第一个字符为标准键盘行
2、调用方法,只要找到一个不属于当前键盘行,就返回false
3、根据返回的布尔值决定是否添加当前字符串
时间:1ms 空间:39.6MB
class Solution {
public boolean f(String s,String str){
for(int i =0;i<str.length();i++){
//只要找到一个不符合当前键盘行的字符就返回假
if(!s.contains(str.charAt(i)+"")){
return false;
}
}
return true;
}
public String[] findWords(String[] words) {
List<String> list = new ArrayList<>();
String s1="qwertyuiop";//键盘第一行
String s2="asdfghjkl";//键盘第二行
String s3="zxcvbnm";//键盘第三行
for(String temp : words){
//先将字符串全部转为小写
String str = temp.toLowerCase();
//如果字符串的第一个字符在键盘的第一行
//调用方法,以下同理
if(s1.contains(str.charAt(0)+"")){
if(f(s1,str)){
//如果返回值为真,代表字符串的所有字符,都在键盘的第一行,添加入结果列表
list.add(temp);
}
//返回值为假,继续判断下一个字符串
else continue;
}
else if(s2.contains(str.charAt(0)+"")){
if(f(s2,str)){
list.add(temp);
}
else continue;
}
else{
if(f(s3,str)){
list.add(temp);
}
else continue;
}
}
//将结果列表转为字符串数组
return list.toArray(new String[list.size()]);
}
}
方法二:hash遍历
解题思路
1、每一行存入一个set集合
2、以第一个字符为标准键盘行
3、循环,只要找到一个不属于当前键盘行,就退出循环
时间:0ms 空间:39.2MB
class Solution {
public String[] findWords(String[] words) {
List<String> res=new ArrayList<>();
String s1="qwertyuiop";
String s2="asdfghjkl";
String s3="zxcvbnm";
Set<Character> set1=new HashSet<>();
Set<Character> set2=new HashSet<>();
Set<Character> set3=new HashSet<>();
//将键盘的每一行存入set集合
for(int i=0;i<s1.length();++i) set1.add(s1.charAt(i));
for(int i=0;i<s2.length();++i) set2.add(s2.charAt(i));
for(int i=0;i<s3.length();++i) set3.add(s3.charAt(i));
//遍历所给的字符串
for(String word:words){
int n1=0,n2=0,len=word.length();
String temp = word.toLowerCase();//转为小写
//记录字符串的第一个元素属于哪一行
if(set1.contains(temp.charAt(0))) {n1=1;n2=n1;}
else if(set2.contains(temp.charAt(0))) {n1=2;n2=n1;}
else if(set3.contains(temp.charAt(0))) {n1=3;n2=n1;}
for(int i=1;i<len&&n1==n2;++i){
//n2代表当前字符所在的行数,若和第一个字符不在同一行退出循环
if(set1.contains(temp.charAt(i))) n2=1;
else if(set2.contains(temp.charAt(i))) n2=2;
else if(set3.contains(temp.charAt(i))) n2=3;
}
if(n1==n2){
//循环结束,n1和n2不相等代表不在同一行
res.add(word);
}
}
return res.toArray(new String[res.size()]);
}
}