【資料結構】python——變位詞判斷
阿新 • • 發佈:2021-02-11
變位詞就是兩個詞中組成字母或漢字相同,但排列不同
判斷兩個詞是否為變位詞的方法有四種:
一、暴力法
演算法思路:將詞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.本文也是學習該課筆記