49. Group Anagrams
单纯做出来倒是没什么难度,但是优化不优化就需要多想想了。
自己的思路大概是:
1. 为一组anagram建HashMap的一条记录,key是这个词转成charArray的string,因为anagram字母排序后是一样的,value是一个List,里面装的是遇到的词
2.扫完之后遍历map,对每个list排序保存
1 public List<List<String>> groupAnagrams(String[] strs) { 2 List<List<String>> res = new ArrayList<List<String>>(); 3 if(strs == null || strs.length == 0) { 4 return res; 5 } 6 HashMap<String, List<String>> map = new HashMap<String, List<String>>(); 7 for(int i = 0 ; i < strs.length; i++) { 8 char[] tempArray = strs[i].toCharArray(); 9 Arrays.sort(tempArray); 10 String str = new String(tempArray); 11 if(map.containsKey(str)) { 12 List<String> list = map.get(str); 13 list.add(strs[i]); 14 } else { 15 List<String> list = new ArrayList<String>(); 16 list.add(strs[i]); 17 map.put(str, list); 18 } 19 } 20 for(HashMap.Entry<String, List<String>> entry: map.entrySet()) { 21 List<String> list = entry.getValue(); 22 list.sort(null); 23 res.add(list); 24 } 25 return res; 26 }
______________________________________________________
update:
1.对于每一个group生成key的时候,现在用的方法是对于charArray进行sort,时间复杂度是O(klogk),k是string的长度,但是如果用char[26]这种算每一个字母的count,再通过拼接的方式生成key,时间复杂度可是降到O(k)
2.还有一种方法,就是对于每一个字母分配一个prime number,比如前26个prime number是{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101}
然后对于每个string把每个字母对应的prime值相乘,因为乘法交换律,所以anagram每个字母的乘机是相同的,所以可以直接算出每个单词的key,但是可能存在问题是,如果这个单词太长,会导致乘积过大,会int溢出