解法1 逐字檢查
解法思路:
將詞1中的字符逐個到詞2中檢查是否存在,存在就打勾標記(防止重複檢查)。如果每個字符都能找到,則兩個詞是變位詞。只要有一個字符找不到,就不是變位詞。
實現打勾標記:將詞2對應字符設爲None,由於字符串是不可變類型,需要先複製到列表中。
#判斷兩個詞是否爲變位詞
def anagramSolution(s1,s2):
alist=list(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]:
found=True
else:
pos2=pos2+1
if found:
alist[pos2]=None#若找到將其變爲None
else:
stillOK=False#未找到失敗
pos1=pos1+1
return stillOK
print(anagramSolution('abcd','dcba'))
print(anagramSolution('python','cython'))
時間複雜度分析
解法2 排序比較
解法思路:
將兩個字符串都按照字母順序排好序,再逐個字符對比是否相同,如果相同則是變位詞,有任何不同就不是變位詞。
#解法2 :判斷兩個詞是否爲變位詞
def anagramSolution(s1,s2):
alist1=list(s1)
alist2=list(s2)
alist1.sort()
alist2.sort()
pos=0
stillOK=True
while pos<len(s1) and stillOK:
if alist1[pos]==alist2[pos]:
pos=pos+1
else:
stillOK=False
return stillOK
print(anagramSolution('abcd','dcba'))
print(anagramSolution('python','cython'))
時間複雜度分析
解法3 計數比較
解法思路:
對比兩個詞中每個字母出現的次數,如果26個字母出現的次數都相同,這兩個字符串一定爲變位詞。
具體做法:
爲每個詞設置一個26位的計數器,先檢查每個詞,在計算其中設定好每個自出出現的次數。計數完成後,進入比較階段,看兩個字符串的計數器是否相同,如果相同則是變位詞。
#解法3 計數比較
def anagramSolution(s1,s2):
counter1=[0]*26
counter2=[0]*26
#對字符串s1和s2分別計數
for i in range(len(s1)):
pos1=ord(s1[i])-ord('a')
counter1[pos1]=counter1[pos1]+1#ord()返回字符對應的ASCII碼值
for j in range(len(s2)):
pos2=ord(s2[j])-ord('a')
counter2[pos2]=counter2[pos2]+1#ord()返回字符對應的ASCII碼值
stillOK=True
pos=0
#對兩個計數器內容進行比較
while pos<26 and stillOK:
if counter1[pos]==counter2[pos]:
pos=pos+1
else:
stillOK=False
return stillOK
print(anagramSolution('abcd','dcba'))
print(anagramSolution('python','cython'))