49. Group Anagrams同义词合并

[抄题]:

Given an array of strings, group anagrams together.

Example:

Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

 [暴力解法]:

时间分析:

空间分析:

 [优化后]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

[思维问题]:

不知道k-v怎么存,看来还是用得不熟练

[一句话思路]:

anagram用String.valueOf(参数)把数据转成字符串,只要字母数组的顺序一样 就一样,所以要排序

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 没法一次处理所有字符串,就一次只处理一个

 

//for loop: add to char, to map
        for (String str : strs) {
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String anagram = String.valueOf(chars);
            if (!map.containsKey(anagram)) map.put(anagram, new ArrayList<String>());
            map.get(anagram).add(str);
        }

 

[二刷]:

[三刷]:

[四刷]:

[五刷]:

  [五分钟肉眼debug的结果]:

[总结]:

String.valueOf(chars) 不但要求字符数组一样,也要求里面元素的顺序一样

[复杂度]:Time complexity: O(n) Space complexity: O(n)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

[关键模板化代码]:

不排序的后果:

[["tan"],["nat"],["tea"],["ate"],["bat"],["eat"]]

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

 [代码风格] :

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        //cc
        if (strs == null || strs.length == 0) return new ArrayList<List<String>>();
        
        //ini: map, char[]
        Map<String, List<String>> map = new HashMap<>();
        
        //for loop: add to char, to map
        for (String str : strs) {
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String anagram = String.valueOf(chars);
            if (!map.containsKey(anagram)) map.put(anagram, new ArrayList<String>());
            map.get(anagram).add(str);
        }
        
        //return (map)
        return new ArrayList<List<String>>(map.values());
    }
}
View Code

 

posted @ 2018-05-05 23:45  苗妙苗  阅读(271)  评论(0编辑  收藏  举报