LeetCode刷题(python版)——Topic49字母异位词分组

一、题设

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 1:

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

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

二、基本思路

        1.我直接暴力+字典,穷举出用i下标下的词的字母异位词,同样的就加入列表中:

def groupAnagrams(self,strs):
        lens = len(strs)
        res = []
        flag = [0 for _ in range(lens)]
        for i in range(lens):  # 遍历每个元素
            if flag[i] == 0:
                tmp = []
                dic1 = {}
                tmp.append(strs[i])
                flag[i] = 1
                # 给str[i]生成字典
                for j in range(len(strs[i])):
                    item = strs[i][j]
                    dic1[item] = dic1.get(item, 0) + 1

                for j in range(i + 1, lens):
                    if flag[j] == 0:
                        # 给str[j]生成字典
                        dic2 = {}
                        for k in range(len(strs[j])):
                            item = strs[j][k]
                            dic2[item] = dic2.get(item, 0) + 1

                        if dic1 == dic2:
                            tmp.append(strs[j])
                            flag[j] = 1

                res.append(tmp)
        return res

        运行结果超时:

         2.于是我便想着能否简化,我想到collection中的counter的方法,也是用字典去计数,我想着封装的方法可能写的效率会比我高一些,于是:

    def groupAnagrams(self,strs):
        from collections import Counter
        lens = len(strs)
        res = []
        flag = [0 for _ in range(lens)]
        for i in range(lens):  # 遍历每个元素
            if flag[i] == 0:
                tmp = []
                tmp.append(strs[i])
                flag[i] = 1
                dic1 = Counter(strs[i])
                for j in range(i + 1, lens):
                    if flag[j] == 0:
                        # 给str[j]生成字典
                        dic2 = Counter(strs[j])
                        if dic1 == dic2:
                            tmp.append(strs[j])
                            flag[j] = 1
                res.append(tmp)
        return res
 

          结果只是单纯代码量变短了,运行效果没啥变化:

        3.接着我想这在思路上能不能有啥变化,想想字典收集元素个数能不能换种方法替代一下,排序,排序成字典序就是一样的数了,直接==比较就完了,也就少了开辟字典和遍历字典的时间空间,代码如下:

    def groupAnagrams(self,strs):
        res = []
        flag = [0 for _ in range(len(strs))]

        for i in range(len(strs)):
            if flag[i] == 0:
                tmp = []
                object1 = sorted(strs[i])
                flag[i] = 1
                tmp.append(strs[i])
                for j in range(i+1,len(strs)):
                    if flag[j] == 0:
                        object2 = sorted(strs[j])
                        if object1 == object2:
                            flag[j] = 1
                            tmp.append(strs[j])
                res.append(tmp)
        return res
                 

        emmm....

        4.最后看题解用了collections的defaultdict方法:也就是用defaultdict方法生成一个mp列表,这一列表若没有元素则用list元素填充,具体用法可以参考:from collections import defaultdict 的用法,将排序后的值作为key,然后将每个数排序后加入key值的value中,最后返回字典的元素即可。我只能说这题学了个方法...

class Solution(object):
    def groupAnagrams(self,strs):
        from collections import defaultdict
        mp = defaultdict(list)
        for item in strs:
            key = "".join(sorted(item))
            mp[key].append(item)
        return mp.values()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值