LeetCode_49.Group Anagrams(字母异位词分组)的两种解法(Python3)

哈哈哈好久没写博了(咕咕咕)

话不多说,上题:

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

示例:

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

字母异位词,顾名思义就是两个单词虽然不一样,但是字母的个数和组成都是一样的,比如:"ate","eat","tea"都是由"a","e","t"组成

所以第一种办法很简单:直接取每个字符串强转为list类型,再用sort排序后再强转回str类型,然后将排序的结果当作值存入字典当作键,遇到一样结果的就存入值,最后取值就行。

比较麻烦,我承认。。。

代码:

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        d = {}
        rel = []
        for i in range(len(strs)):
            h = list(strs[i])
            h.sort()
            if str(h) in d:
                d[str(h)].append(strs[i])
            else:
                d[str(h)] = [strs[i]]
        for i in d:
            rel.append(d[i])
        return rel

 

还有一种方法,是外国的大佬想的一个神奇的思路:

用质数表示26个字母,把字符串的各个字母相乘,这样可保证字母异位词的乘积必定是相等的。然后就是存入map了(Python就直接用字典存)

代码:

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        #求26个质数
        prime = {"a":2,'b':3,'c':5,'d':7}
        i = 101
        n = 11
        while i < 123:
            if n % 2 != 0 and n % 3 != 0 and n % 5 != 0 and n % 7 != 0:
                prime[chr(i)] = n
                i += 1
            n += 1
        
        #创建map
        rd = {}
        m = 1
        for i in strs:
            for j in i:
                m *= prime[j]
            if m in rd:
                rd[m].append(i)
            else:
                rd[m] = [i]
            m = 1
            
        #求出结果
        rel = []
        for i in rd:
            rel.append(rd[i])
        return rel

OK 完拉,古德拜。

你可能感兴趣的:(LeetCode_49.Group Anagrams(字母异位词分组)的两种解法(Python3))