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

xiaoxiao2021-02-28  20

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

示例:

输入: ["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对应的位置应该是和eta和tea相同,都是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

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

转载请注明原文地址: https://www.6miu.com/read-2649974.html

最新回复(0)