Leetcode 49:字母异位词分组(最详细解决方案!!!)

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

示例:

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

说明:

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

解题思路

Leetcode 242:有效的字母异位词(最详细解决方案!!!)

Leetcode 438:找到字符串中所有字母异位词(最详细解决方案!!!)

基于上面两篇,我们对于异位词问题已经有了一定的认识了,所谓的异位词不过是,单词对应的不同字母的个数都一样。

所以我们可以将输入列表strs中的字符串通过collections.Counter统计字符出现的个数,接着将相同的counter放到一个列表中即可,但是这里不合适因为counter不能作为key,因为是不可hash的对象。所以这种方式好像不可行,我们还有没有办法判断异位词呢?我们可以将所有的str排序后比较。那么我们可以将排序好的str作为key,那么value是什么呢?value应该是result列表中str对应列表的位置。例如

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

result例表中ate对应的位置应该是和etatea相同,都是0。于是我们就有了如下的算法

class Solution:
    def groupAnagrams(self, strs):
        """
        :type strs: List[str]
        :rtype: List[List[str]]
        """
        strs_map = {}
        result = []
        for i in strs:
            string = ''.join(sorted(i))
            if string not in strs_map:
                strs_map[string] = len(result)
                result.append([string])
            else:
                result[strs_map[string]].append(string)
        return result

或者我们的key是排序好的str,而value是一个list,里面存放的是没有排序的str

class Solution:
    def groupAnagrams(self, strs):
        """
        :type strs: List[str]
        :rtype: List[List[str]]
        """
        strs_map = {}
        result = []
        for string in strs:
            tmp = ''.join(sorted(string))
            if tmp in strs_map:
                strs_map[tmp].append(string)
            else:
                strs_map[tmp] = [string]
                
        for str_list in strs_map.values():
            result.append(str_list)
        
        return result

我更加喜欢第二种做法。

我们还有一种更pythonic的写法

class Solution:
    def groupAnagrams(self, strs):
        """
        :type strs: List[str]
        :rtype: List[List[str]]
        """
        from collections import defaultdict
        dic = defaultdict(list)
        for s in strs: 
            dic["".join(sorted(s))].append(s)
        return list(dic.values())

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

你可能感兴趣的:(Problems,leetcode解题指南)