题目:
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.
链接:https://leetcode.com/problems/keyboard-row/#/description
3/29/2017
performance 8ms, beat 15%
注意的问题:
1. 第3,4,5行的初始化
2. 第11,12行的建立set。为什么不能采取1中的方法?Character[]和char[]是不能自动转化的。我对Java了解不清,需要仔细研究。
3. 第6,15行,ArrayList和[]转化
4. set1.retainAll(set2)是求交集,set1.containsAll(set2)是求s2是否为s1的子集
1 public class Solution { 2 public String[] findWords(String[] words) { 3 Set<Character> s1 = new HashSet<Character>(Arrays.asList('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p')); 4 Set<Character> s2 = new HashSet<Character>(Arrays.asList('a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l')); 5 Set<Character> s3 = new HashSet<Character>(Arrays.asList('z', 'x', 'c', 'v', 'b', 'n', 'm')); 6 ArrayList<String> tmp = new ArrayList<String>(); 7 8 for (int i = 0; i < words.length; i++) { 9 Set<Character> s = new HashSet<Character>(); 10 String t = words[i].toLowerCase(); 11 for (int j = 0; j < words[i].length(); j++) 12 s.add(t.charAt(j)); 13 if (s1.containsAll(s) || s2.containsAll(s) || s3.containsAll(s)) tmp.add(words[i]); 14 } 15 String[] ret = tmp.toArray(new String[tmp.size()]); 16 return ret; 17 } 18 }
看别人的算法,基本上如果performance好的话,在循环体里不用containsAll而是自己单独每个character比较。
更多讨论: