1. 程式人生 > 其它 >【資料結構】python——變位詞判斷

【資料結構】python——變位詞判斷

技術標籤:資料結構演算法資料結構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.本文也是學習該課筆記