49 - 字母异位词分组 - python + Java

101 阅读2分钟

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

示例:

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

]

说明:

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

Python解法

题目要求将字母异位词分组,即将由相同字母组成但排序不同的词分到同一组中。判断两个词组成的字符是否都相同,我们可以使用sorted()将单词按字典序排列后进行排序。然后将所有按字典序排列后相同的词分到一组中,同时结果使用字典存储,键为字典序排序结果,值为所有由键中字符排列组合得到的词。

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        if not strs: return []

        # 字母异位单词可以通过字典序判断
        res = dict()  # {k : v},其中k为按字典序排序后的字符串,v为相同字典序字符串的数组

        for word in strs:
            key = ''.join(sorted(word))
            if key in res.keys():
                res[key].append(word)
            else:
                res[key] = [word]

        return list(res.values())

Java解法

Java中没有直接的函数来对一个字符串进行字典序排序,而是需要借助String.toCharArray()先将字符串转换为char型数组,然后调用Arrays的sort()来进行排序。按照题目的要求可知,具有相同字典序的单词有多个,所以需使用一个Map来进行存储。最后返回Map的值所构成的列表即可,具体的测试代码如下所示:

class Solution {
    public static List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            // 将char型数组转换为字符串作为key
            String s = String.valueOf(chars);
            if (map.containsKey(s) == true){
                map.get(s).add(str);
            } else {
                ArrayList<String> list = new ArrayList<>();
                list.add(str);
                map.put(s, list);
            }

        }
        map.forEach((k, v) -> System.out.println(v.toString()));
        /*
        	[eat, tea, ate]
			[bat]
			[tan, nat]
        */

        return new ArrayList(map.values());
    }

    public static void main(String[] args) {
        String[] array = {"eat","tea","tan","ate","nat","bat"};
        groupAnagrams(array);
    }
}