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

python求解变位词

  • 1. 逐字检查
  • 2. 排序比较
  • 3. 暴力解
  • 4. 计数比较
  • 对比list和dict操作

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操作

代码 | python算法:求解变位词_第1张图片

你可能感兴趣的:(python,算法)