题目原址
https://leetcode.com/problems/keyboard-row/description/
题目描述
Given a List of words, return the words that can be typed using letters of alphabet on only one row’s of American keyboard like the image below.
Example1:
Input: [“Hello”, “Alaska”, “Dad”, “Peace”]
Output: [“Alaska”, “Dad”]
Note:
- You may use one character in the keyboard more than once.
- You may assume the input string will only contain letters of alphabet.
解题思路
题目要求是:给定一个字符串数组,返回这个数组中每个字符串中的字符是在同一行上的字符串。
- 因为给定的字符串中的字符是否在同一行上,只需要判断字符串的每个字符是不是在同一个类型中即可。键盘上的字母只包含3行,在这里就是三类,一类在上面、一类中间、一类下面。
- 所以首先要把所有字母进行分类,没有什么好的办法,只能把所有的字符一一放进set集合中。(注意大小写,要把大写和小写都放进来)。
- 然后拿到每个字符串的第一个字符,用第一个字符定位这个字符串所在的位置。
- 通过for循环判断字符串中剩余字符属于哪一类,如果属于的类不是第一个字符所在的类,那么这个字符串就不符合题意。所以这里面需要添加一个判断标志,如果第一个字符与字符串的其他字符在一类,将该标志置为true
- 最后将符合题意的字符串放在字符数组中返回即可。
AC代码
class Solution {
public String[] findWords(String[] words) {
String[] ret = new String[words.length];
Set<Character> setUp = new HashSet<Character>();
Set<Character> setMedium = new HashSet<Character>();
Set<Character> setDown = new HashSet<Character>();
setUp.add('Q');setUp.add('W');setUp.add('E');setUp.add('R');setUp.add('T');setUp.add('Y');setUp.add('U');setUp.add('I');setUp.add('O');setUp.add('P');
setUp.add('q');setUp.add('w');setUp.add('e');setUp.add('r');setUp.add('t');setUp.add('y');setUp.add('u');setUp.add('i');setUp.add('o');setUp.add('p');
setMedium.add('A');setMedium.add('S');setMedium.add('D');setMedium.add('F');setMedium.add('G');setMedium.add('H');setMedium.add('J');setMedium.add('K');setMedium.add('L');
setMedium.add('a');setMedium.add('s');setMedium.add('d');setMedium.add('f');setMedium.add('g');setMedium.add('h');setMedium.add('j');setMedium.add('k');setMedium.add('l');
setDown.add('Z');setDown.add('X');setDown.add('C');setDown.add('V');setDown.add('B');setDown.add('N');setDown.add('M');
setDown.add('z');setDown.add('x');setDown.add('c');setDown.add('v');setDown.add('b');setDown.add('n');setDown.add('m');
int count = 0;
int n = words.length;
boolean temp = false;
int m = 0;
for(int i = 0; i < n; i++) {
String s = words[i];
int flag = 0 ;
temp = false;
if(setUp.contains(s.charAt(0))){
flag = 1;
}
else if(setMedium.contains(s.charAt(0)))
{
flag = 2;
}
else{
flag = 3;
}
for(int j = 1; j < s.length();j++){
if(setUp.contains(s.charAt(j))){
if(flag != 1) {
temp = true;
break;
}
}
else if(setMedium.contains(s.charAt(j)))
{
if(flag != 2){
temp = true;
break;
}
}
else{
if(flag != 3)
{
temp = true;
break;
}
}
}
if(!temp)
ret[count++] = s;
}
for(int i = 0; i < words.length && ret[i] != null ; i++)
m++;
String[] re = new String[m];
for(int i = 0; i < words.length && ret[i] != null; i++)
re[i] = ret[i];
return re;
}
}