【数据结构】python——变位词判断

 变位词就是两个词中组成字母或汉字相同,但排列不同

 判断两个词是否为变位词的方法有四种:

一、暴力法

 算法思路:将词1中出现的字符进行全排列,再查看全排列结果中是否报刊词2
 缺点:全排列结果过多

二、逐字检查法

 算法思想:将词1中的字符逐个到词2中检查是否存在,存在就“打勾”(将对应字符设置为None),若词1中每个字符都能在词2中找到,则两个词是变位词,只要有一个找不到,则不是

def anagramsolution1(s1,s2):
    alist=list(s2)#复制s2到列表
    pos1=0
    stillok=True
    while pos1<len(s1)and stillok:#循环s1的每个字符
        pos2=0
        found=False
        while pos2<len(alist)and not found:#循环S2的每个字符
            if s1[pos1]==alist[pos2]:#在s2逐个对比
                found=True
            else:
                pos2=pos2+1
        if found:
            alist[pos2]=None#找到了打勾
        else:
            stillok=False#没找到,失败,下边也不会循环了,直接结束了
        pos1=pos1+1
    return stillok

 算法时间复杂度:O(n2)
 缺点:当两个词中字符元素都相同,但字符出现次数不同时,该方法失效

三、排序比较

 算法思路:将两个词都按字母顺序排序,再逐个字符对比是否相同,相同则为变位词

def anagramsolution2(s1,s2):
    alist1=list(s1)
    alist2=list(s2)#复制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

 算法时间复杂度:O(nlogn)

四、计数比较法

 算法思路:对比两个词中每个字母出现的次数,若26个字母出现的次数都相同,则为变位词

def anagramsolution3(s1,s2):
    c1=[0]*26
    c2=[0]*26 
    for i in range(len(s1)):
        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   
    j=0
    stillok=True
    while j<26 and stillok:
        if c1[j]==c2[j]:
            j=j+1
        else:
            stillok=False
    return stillok

 算法复杂度:O(n)
 缺点:空间复杂度高

发现某站有一个数据结构课很不错,是北大老师讲的, 链接如下:https://www.bilibili.com/video/BV1VC4y1x7uv?p=12&spm_id_from=pageDriver.本文也是学习该课笔记

猜你喜欢

转载自blog.csdn.net/m0_46568930/article/details/113784363