Medium | LeetCode 49. 字母异位词分组 | 字符串(异位词)

49. 字母异位词分组

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

说明:

  • 所有输入均为小写字母。
  • 不考虑答案输出的顺序。

方法一: 排序

对每个字符串, 将其字符进行排序, 这样字母异位词排序之后就会得到相同的字符串。

设置一个HashMap, Key为排序后的字符串, 将所有字符串按字符排序后的KEY, 添加进hashMap就可以了。

public List<List<String>> groupAnagrams(String[] strs) {
    Map<String, List<String>> map = new HashMap<String, List<String>>();
    for (String str : strs) {
        char[] array = str.toCharArray();
        Arrays.sort(array);
        String key = new String(array);
        List<String> list = map.getOrDefault(key, new ArrayList<String>());
        list.add(str);
        map.put(key, list);
    }
    return new ArrayList<List<String>>(map.values());
}

方法二: 计数

方法一是使用排序的方式判断两个字符串是否是字母异位词。还有一种可以采取计数的方式。使用长度为26的数组进行计数即可。

public List<List<String>> groupAnagrams(String[] strs) {
    Map<String, List<String>> map = new HashMap<String, List<String>>();
    for (String str : strs) {
        int[] counts = new int[26];
        int length = str.length();
        // 统计每个字符串每个字符出现的次数
        for (int i = 0; i < length; i++) {
            counts[str.charAt(i) - 'a']++;
        }
        // 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的键
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 26; i++) {
            if (counts[i] != 0) {
                sb.append((char) ('a' + i));
                sb.append(counts[i]);
            }
        }
        String key = sb.toString();
        List<String> list = map.getOrDefault(key, new ArrayList<String>());
        list.add(str);
        map.put(key, list);
    }
    return new ArrayList<List<String>>(map.values());
}
原文地址:https://www.cnblogs.com/chenrj97/p/14444067.html