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"]
]

Note:

  • All inputs will be in lowercase.
  • The order of your output does not matter.
public List<List<String>> groupAnagrams(String[] strs) {
    List<List<String>> res = new LinkedList<>();
    HashMap<String, List<String>> map = new HashMap<>();

    for (String str: strs) {
        String key = convert(str);            
        if (map.containsKey(key)) {
            map.get(key).add(str);
        } else {
            List<String> list = new LinkedList<>();
            list.add(str);
            map.put(key, list);
        }
    }

    for (Map.Entry<String, List<String>> entry: map.entrySet()) {
        res.add(entry.getValue());
    }

    return res;
}

private String convert(String str) {
    char[] chars = str.toCharArray();
    Arrays.sort(chars);

    // return Arrays.toString(chars);  // "[a, e, t]"
    return new String(chars);          // "aet"
}

几点:

  • str.toCharArray() convert str to char array
  • Arrays.toString(array) convert array to "[item, item, ..., item]"
  • constructor of String: new String(char[] array), new String(byte[] array), new String(String str)
  • HashMap: values() => Collection<V>, 'keySet() => Set<K>'

Solution 2: Count Sort

m: size of strs array;
n: length of str

上面的题解为 O(m * n * logn)
下面的题解 Runtime 为 O(m * n * 26).

如果是针对单词,上面的题解会更好,因为单词的长度是 20 以内。如果是很长的字符串,下面的题解会更好。

private String convert(String str) {
    int[] count = new int[26];
    for (char c: str.toCharArray()) {
        int index = (int)(c - 'a');
        count[index]++;
    }

    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < count.length; i++) {
        if (count[i] == 0) {
            continue;
        }
        builder.append(count[i]).append('a' + i);
    }

    return builder.toString();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,418评论 0 10
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 3,124评论 0 7
  • Given an array of strings, group anagrams together.For ex...
    DrunkPian0阅读 465评论 0 0
  • 看到我凌乱的头发没有,今天是举国同庆的日子,虽然我真的该高兴高兴。但是!我真的好想说,我超讨厌这样的节假日好不好!...
    c2b427db343a阅读 160评论 0 0
  • 今天傍晚,接晴回家的路上,她给我讲了一件事,不由佩服她的聪明,也感叹生命的美好。 事情是这样的,不知怎么的,晴的同...
    真冉阅读 311评论 0 0