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没仔细看,但是时间复杂度应该一样的,可以了。

posted @ 2019-01-02 15:32  大胖子球花  阅读(127)  评论(0)    收藏  举报