代码 | python算法:求解变位词

文章介绍了使用Python解决变位词(anagram)问题的四种方法,包括逐字检查、排序比较、暴力破解和计数比较。其中,计数比较方法在时间复杂度上最优,为O(n)。其他方法如排序比较的时间复杂度为O(n^2)或O(nlogn)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 逐字检查

#解法1 逐字检查
# 程序技巧 “打“标记,词对应字符设为None
# 字符串是不可变类型,需要先复制到列表中

def anagramSolution(s1,s2):
    alist=list(s2)
    pos1=0
    stillOK=True
    while pos1<len(s1) and stillOK:
        pos2=0
        found=False
        while pos2<len(alist) and not found:
            if s1[pos1]==alist[pos2]:
                found=True
            else:
                pos2=pos2+1
        if found:
            alist[pos2]=None
        else:
            stillOK=False
        pos1=pos1+1

    return stillOK

print(anagramSolution('abcd','badc'))
# 两重循环O^2


2. 排序比较


# 解法2:排序比较
# 两个字符串都排好序再对比,相同就是变位词
def anagramSolution2(s1,s2):
    alist1=list(s1)
    alist2=list(s2)

    alist1.sort()
    alist2.sort()
    pos=0
    matches=True
    while pos < len(s1)and matches:
        if alist1[pos]==alist2[pos]:
            pos=pos+1
        else:
            matches=False
    return matches
print(anagramSolution2('abcde','edcba'))
# sort排序需要On^2或者Onlogn

3. 暴力解


# 解法3:暴力法
# 全排列某一字符串看与另外一串是否相同O2^n

4. 计数比较


# 解法4:计数比较
# 对比两个词中每个字母出现的次数,如果26个字母出现次数相同就是变位词
def anagramSolution4(s1,s2):
    c1=[0]*26
    c2=[0]*26
    for i in range(len(s1)):
        pos=ord(s1[i])-ord('a') # ord函数返回unicode编码
        c1[pos]=c1[pos]+1
    for i in range(len(s2)):
        pos=ord(s2[i])-ord('a')
        c2[pos]=c2[pos]+1
    j=0
    stillOK=True
    while j<26 and stillOK:
        if c1[j]==c2[j]:
            j=j+1
        else:
            stillOK=False
        return stillOK
print(anagramSolution4('aacd','daca'))
# 时间复杂度只有On,性能最优

对比list和dict操作

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值