49. Group Anagrams


July-17-2019

第一反应是每个String都sort一下,然后分类,事实上也是正确的。。
Time: O(n KlgK)
Space: O(nk)
k = length of word

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {

        Map<String, List<String>> m = new HashMap<>();
        for (String s : strs) {
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String tempKey = new String(chars);
            if (!m.containsKey(tempKey)) {
                m.put(tempKey, new ArrayList<>());
            }
            m.get(tempKey).add(s);
        }

        return new ArrayList<>(m.values());
    }
}

上面其实没用Anagram的另一个特性,char出现的次数相等就行,所以sort的KlgK其实浪费了,我们只要算出每个字母出现的次数然后作为Map里的key就行。

时间上:KlgK => 26K
Time: O(nK*26)

    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        int[] charCount = new int[26];
        StringBuilder keyBuilder = new StringBuilder();
        for (String s : strs) {
            Arrays.fill(charCount, 0);
            for (char c : s.toCharArray()) {
                charCount[c - 'a'] ++;
            }
            keyBuilder = new StringBuilder();
            for (int i = 0; i < 26; i ++) {
                keyBuilder.append(charCount[i]).append((char)(i + 'a'));
            }
            String tempKey = keyBuilder.toString();
            if (!map.containsKey(tempKey)) map.put(tempKey, new ArrayList<>());
            map.get(tempKey).add(s);
        }
        return new ArrayList<>(map.values());
    }


三刷。

印象很深,秒之。。
利用anagram的单词sort之后的结果是一样的。

建立一个< String, List< String >>的map,每个string都先sort一下,然后所有sort之后和这个一样的放到一个list里。。

最后按list添加就行了。。

Time Complexity: O(k nlgn) K个单词,每个排序nlgn
Space Complexity: O(nk) 所有单词存到MAP里。

public class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        
        for (int i = 0; i < strs.length; i++) {
            char[] ch = strs[i].toCharArray();
            Arrays.sort(ch);
            String tempStr = new String(ch);
            if (map.containsKey(tempStr)) {
                map.get(tempStr).add(strs[i]);
            } else {
                List<String> l = new ArrayList<>();
                l.add(strs[i]);
                map.put(tempStr, l);
            }
        }
        
        for (String s: map.keySet()) {
            res.add(map.get(s));
        }
        return res;
        
    }
}
posted @ 2016-11-17 12:34  哇呀呀..生气啦~  阅读(682)  评论(0编辑  收藏  举报