Leetcode49. Group Anagrams
开始的思路就是暴力解法,写一个判断是否是Anagrams的方法,然后每轮都从头到尾遍历,找到最终结果,O(N^3)。下面是未写完的部分代码:
class Solution { public List<List<String>> groupAnagrams(String[] strs) { } private boolean isAnagrams(String a,String b){ if(a.length()!=b.length()) return false; boolean[] bChecked = new boolean[b.length()]; for(int i=0;i<a.length();i++){ } } }
然后看了Solution,是两个分别为O(nklogk)和O(nk)的方法,都是使用了hashmap的values作为arraylist构造器的参数,并分别用sort和遍历生成字符串来做map的key。
class Solution { public List<List<String>> groupAnagrams(String[] strs) { HashMap<String,List> ans = new HashMap<>(); for(String str:strs){ char[] ca = str.toCharArray(); Arrays.sort(ca); String key = String.valueOf(ca); if(!ans.containsKey(key)){ List<String> value = new ArrayList<>(); ans.put(key,value); } ans.get(key).add(str); } return new ArrayList(ans.values()); } }
23ms,46.34%。O(nklogk)。
这里我对泛型产生点疑问:
最后一句return的如果是
return new ArrayList<List<String>>(ans.values());
就会报错。为啥呢?
Line 14: error: no suitable constructor found for ArrayList(Collection<List>) return new ArrayList<List<String>>(ans.values()); ^ constructor ArrayList.ArrayList(int) is not applicable (argument mismatch; Collection<List> cannot be converted to int) constructor ArrayList.ArrayList(Collection<? extends List<String>>) is not applicable (argument mismatch; Collection<List> cannot be converted to Collection<? extends List<String>>)
为啥调用泛型类的构造方法可以不用声明泛型呢?
一会儿看看Java核心技术去。
第二种方法则是将str遍历一遍得到一个字符串"1#2#..."来表示每个字母的数量。
class Solution { public List<List<String>> groupAnagrams(String[] strs) { HashMap<String,List> ans = new HashMap<>(); for(String str:strs){ char[] ca = str.toCharArray(); int[] counts = new int[26]; for(char c:ca) counts[c-'a']++; StringBuilder sb = new StringBuilder(); for(int count:counts){ sb.append(count); sb.append(':'); } String key = sb.toString(); if(!ans.containsKey(key)){ List<String> value = new ArrayList<>(); ans.put(key,value); } ans.get(key).add(str); } return new ArrayList(ans.values()); } }
O(nk),时间复杂度上更低了,速度却更慢了/笑哭。35ms,19.74%.
看了10ms思路,有点小trick没仔细看,但是时间复杂度应该一样的,可以了。

浙公网安备 33010602011771号