变位词判断问题
所谓‘变位词’是指两个词之间存在组成字母的重新排列关系。为了简单起见,假设参与判断的两个词仅有小写字母构成,且长度相等。
解法1:逐字检查
将词1的字符逐个到词2中检查是否存在,存在就标记。如果每个字符都能找到,则两个词是变位词;只要有一个字符找不到,就不是变位词。
def solution1(s1,s2):
alist=list(s2)
pos1=0
stillOK=True
while pos1<len(alist) and stillOK:
pos2=0
found=False
while pos2<len(alist) and not found:
if s1[pos1]==alist[pos2]:
found=True
else:
pos2=pos2+1
if found:
alist[pos2]='NONE'
else:
stillOK=False
pos1=pos1=1
return stillOK
解法2:排序比较
解题思路:将两个字符串都按照顺序排好序,再逐个字符对比是否相同,如果相同则是变位词,有任何不同就不是变位词。
def solution2(s1,s2):
alist1=list(s1)
alist2=list(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
解法3:暴力法
解题思路:穷尽所有可能组合。将s1中出现的字符进行全排列,再查看s2是否出现在全排列列表中。
*这里最大困难是产生s1所有字符的全排列。
ps:因为n!的增长速度甚至超过2^n,因此暴力法恐怕不能算是个好算法。
解法4:计数比较
解题思路:对比两个词中每个字母出现的次数,如果26个字母出现的次数都相同的话,这两个字符串就一定是变位词。
def solution4(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