题意:
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.
Example 1:
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.
就是让我们判断输入的字符串是否在键盘的同一行上。
思路很简单,先做记录,再看看有没有什么高明的方法。
private static char[][] tables = new char[3][]; static{ tables[0] = "QWERTYUIOP".toCharArray(); tables[1] = "ASDFGHJKL".toCharArray(); tables[2] = "ZXCVBNM".toCharArray(); } public String[] findWords(String[] words) { if(words == null){ return null; } List<String> list = new ArrayList<String>(); for(int i=0; i<words.length; i++){ String str = words[i]; if(str == null){ continue; } char[] checkChars = str.toUpperCase().toCharArray(); char[] checkedChars = new char[26];//保存已受检的字符 //查找目标行 int target = 0; for(;target < tables.length; target++){ if(contains(tables[target], checkChars[0])){ checkedChars[checkChars[0] - 'A'] = 1; break; } } char[] targetChar = tables[target]; //检查剩下的字符 boolean isValid = true; for(int index = 1; index < checkChars.length; index++){ char checkChar = checkChars[index]; if(checkedChars[checkChar - 'A'] != 0){ }else if(!contains(targetChar, checkChar)){ isValid = false; break; } } if(isValid){ list.add(str); } } return list.toArray(new String[list.size()]); } private boolean contains(char[] chars, char targetChar){ for(int i=0; i<chars.length; i++){ if(chars[i] == targetChar) return true; } return false; }