给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。
示例:
输入: ["Hello", "Alaska", "Dad", "Peace"] 输出: ["Alaska", "Dad"]
思路:利用 Map 的键值对,存放每一行字符所对应的行数,然后将目标字符串转为小写字符串,并且转为字符数组,然后利用此字符数组,判断是否在同一行内,如果是在同一行内就加入 List,最后返回以字符串的形式返回 List 的内容。
代码:
class Solution {
public String[] findWords(String[] words) {
List<String> list = new ArrayList<>();
Map<Character,Integer> map = new HashMap<>();
String line1 = "qwertyuiop";
String line2 = "asdfghjkl";
String line3 = "zxcvbnm";
for(char c : line1.toCharArray()){
map.put(c,1);
}
for(char c : line2.toCharArray()){
map.put(c,2);
}
for(char c : line3.toCharArray()){
map.put(c,3);
}
for(String word :words){
boolean add = true;
char[] cs = word.tocharArray();
int rownumber = map.get(cs[0]);
for(char c:cs){
if(rownumber != map.get(c)){
add = false;
break;
}
}
if(add){
list.add(word);
}
}
String[] a = new String[list.size()];
for(int i = 0;i < list.size ;i++){
a[i] = list.get(i);
}
return a;
}
}
大神思路:先根据目标字符串的第一个字符判断是应该哪一行的字符,然后利用这一行的字符串的indexOf() 方法判断目标字符串的每一个字符的下标,如果返回 -1 ,就说明不包含在内。
代码:
class Solution {
public String[] findWords(String[] words) {
String qline = "QWERTYUIOPqwertyuiop";
String aline = "ASDFGHJKLasdfghjkl";
String zline = "ZXCVBNMzxcvbnm";
String m = "";
List<String> list = new ArrayList<>();
for(String word : words){
if(qline.indexOf(word.charAt(0))!=-1){
m = qline;
}
if(aline.indexOf(word.charAt(0))!= -1){
m = aline;
}
if(zline.indexOf(word.charAt(0))!= -1){
m = zline;
}
boolean flag = true;
for(int i = 0;i < word.length();i++){
if(m.indexOf(word.charAt(i)) == -1){
flag = false;
break;
}
}
if(flag){
list.add(word);
}
}
String[] a = new String[list.size()];
for(int i = 0;i < list.size();i++){
a[i] = list.get(i);
}
return a;
}
}