有两个字符串,如果他们中的一个是另一个的字母顺序颠倒过来,组成的字符串。那么就返回True。否则,返回False。假定两个字符串的长度相等。
比如,‘heart’和‘earth’,返回True。而“abcd”“abdd”返回False。
两种解决思路:
1.以其中的一个字符串s1为参照,另一个字符串s2放到一个list中命名为a_list,将s1中的字符拿出来和a_list中的每一个字符作比较,如果找到,那么a_list中的这个位置将设置为None。如果找不到,返回False。最终所有的都找到,才能返回True。
2.将字符串s1和s2分别用内置函数sort先进行排序。然后再一个一个字符作比较。如果有不同的,返回False。所有的字符都相同,返回True.
代码如下:
def anagram_solution1(s1,s2):
a_list=list(s2)
still_ok=True
pos1=0
count=0
while pos1<len(s1) and still_ok:
found=False
pos2=0
while pos2<len(s2) and not found:
if s1[pos1]==a_list[pos2]:
found=True
a_list[pos2]=None
else:
pos2+=1
count+=1
if found==False:
still_ok=False
else:
pos1+=1
return still_ok
def anagram_solution2(s1,s2):
a_list=list(s1)
b_list=list(s2)
a_list.sort()
b_list.sort()
pos=0
still_ok=True
while pos<len(s1) and still_ok:
if a_list[pos]==b_list[pos]:
pos+=1
else:
still_ok=False
return still_ok
if __name__=="__main__":
s1="abcd"
s2="adbc"
print(anagram_solution1(s1,s2))
print(anagram_solution2(s1,s2))
运行结果:
>>>
RESTART: D:\Program Files\Python\test\algorithms\data structure and problem solving by python\1-anagram.py
True
True
方法1的算法复杂度:
方法2的算法复杂度:
因为Python的sort方法的复杂度是O(N的平方)或者O(nlgn)。所以方法2的算法复杂度不是O(n)。而是O(N的平方)或者O(nlgn)
方法3:
检测两个字符串中每个字母的数量。分别给每个字符串分配一个长度为26的列表,存放相应字母的数量。最后比较这两个列表是否相同。
def anagram_solution3(s1,s2):
ch1=[0]*26
ch2=[0]*26
for i in range(len(s1)):
pos=ord(s1[i])-ord('a')
ch1[pos]+=1
for i in range(len(s2)):
pos=ord(s1[i])-ord('a')
ch2[pos]+=1
matches=True
j=0
while j<26 and matches:
if ch1[j]==ch2[j]:
j+=1
else:
matches=False
return matches
ord()以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值.
方法3的算法复杂度O(n)