leetcode49. 字母异位词分组

本文介绍了如何使用Python通过排序字符串并创建映射来高效找出字符串数组中的同构词组。首先,通过排序每个字符串,然后根据字母组合映射到同一组。通过两次迭代优化了查找过程,避免了重复匹配。第二版算法在处理大规模数据时显著提高了效率。
摘要由CSDN通过智能技术生成

题目描述:

题解:

第一版:

1.利用两个循环依次比较输入strs中的字符串strs[i] strs[j]

2.在比较strs[i] strs[j]的时候,对strs[i]的每个字符,判断strs[j]中是否存在

3.需要注意每结束一次比较,如果在strs[j]找到对应的字符,将该位置replace位空,防止多次匹配同一位置的字符,同时将replace最大次数设为1,防止将所有相同字符修改为空。

结果:在最后一个测试样例超时

def groupAnagrams(self,strs):
    final_list = []
    group = []
    strs_flag = []
    for i in range(len(strs)):
        strs_flag.append(0)
    for i in range(len(strs)):
        if strs_flag[i]==0:
            group.append(strs[i])
            for j in range(i+1,len(strs)):
                if strs_flag[i]==0 and strs_flag[j]==0:
                    str1 = strs[i]
                    str2 = strs[j]
                    if len(str1)==len(str2):
                        flag = 0
                        for k in range(len(str1)):
                            pos = str2.find(str1[k])
                            if pos!=-1:
                                str2 = str2.replace(str2[pos],' ',1)

                                flag = flag+1
                        if flag==len(str1):
                            group.append(strs[j])
                            strs_flag[j]=-1
            strs_flag[i]=-1

            final_list.append(group)
            group = []
    return final_list

第二版:

参考:https://blog.csdn.net/qq_17550379/article/details/80633737

1.将strs中的每个字符串排序。
2.将具有相同字母组成的字符串映射到同一位置
2.采用dict mapped_pos记录每组字符串及对应的位置
def groupAnagrams(self, strs):
    mapped_pos = {}
    result = []
    str_num = len(strs)
    for i in range(str_num):
        sorted_str = str(sorted(strs[i]))
        print(type(sorted_str))
        if sorted_str in mapped_pos:
            pos = mapped_pos[sorted_str]
            result[pos].append(strs[i])
        else:
            mapped_pos[sorted_str] = len(result)
            result.append([strs[i]])
    return result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值