变位词:字母相同但位置不同,例如python和typhon、earth和heart

 

解法一:逐个字母检查,复杂度O(n²),代码省略

 

解法二:先将字母排序,再比较对应位置的字母。复杂度O(nlogn),由排序决定复杂度

#变位词,先将字母排序,再检查对应位置的字母是否一致

def anagramSolution(s1,s2):
    #转为列表
    alist1 = list(s1)
    alist2 = list(s2)

    #分别排序
    alist1.sort()
    alist2.sort()

    #先判断长度是否一致
    if(len(s1)!=len(s2)):
        return False

    pos = 0
    matches = True
    while pos<len(s1) and matches:
        if alist1[pos] == alist2[pos]:
            pos += 1
        else:
            matches = False
    return matches

print(anagramSolution('abcd','dcba'))

 

解法三:对比两个词中每个字母的出现次数,如果26个字母出现的次数相同则为变位词。复杂度O(n)

#变位词,对比两个词中每个字母的次数,如果26个字母出现位置都相同就是变位词
def anagramSolution(s1,s2):
    #c1,c2为26个字母出现次数的列表
    c1 = [0] * 26
    c2 = [0] * 26

    for i in range(len(s1)):
        #ord()将字符转换为对应的ascii码
        pos = ord(s1[i]) - ord('a')
        c1[pos] = c1[pos] + 1
    for i in range(len(s2)):
        pos = ord(s2[i]) - ord('a')
        c2[pos] = c2[pos] + 1

    stillOK = True

    if c1 != c2:
        stillOK = False

    return  stillOK

print(anagramSolution('abc','bca'))