变位词就是两个词中组成字母或汉字相同,但排列不同
判断两个词是否为变位词的方法有四种:
一、暴力法
算法思路:将词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.本文也是学习该课笔记