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溢出

 

posted @ 2016-03-02 03:54  warmland  阅读(234)  评论(0编辑  收藏  举报