赏月斋源码共享计划 第六期 变位词判断
本文用三种算法实现了变位词判断问题。
所谓“变位词”是指两个词之间存在组成字母的重新排列关系,如:heart和earth,python和typhon
假设参与判断的词仅由大写字母组成。
解题目标:写一个bool函数,以两个词作为参数,返回这两个词是否变位词。
输入:两个字符串s1和s2
返回:一个bool变量。
# coding=utf8
def judgeStr_1(s1, s2):
# 先排序,再对比
list1 = list(s1)
list2 = list(s2)
list1.sort()
list2.sort()
# if list1 == list2: # 这样判断也可以
# return True
# else:
# return False
if len(list1) != len(list2):
return False
for i in range(len(list1)):
if list1[i] == list2[i]:
continue
else:
return False
return True
def judgeStr_2(s1, s2): # 打钩法(两层循环,在s2里边便利找s1的当前值,找到打标记found,未找到found=false),注意s1每循环一次都要将found置为false
l1 = list(s1)
l2 = list(s2)
OK = True
if len(l1) != len(l2):
OK = False
k = 0
found = False
for i in range(len(l1)):
found = False
for j in range(len(l2)):
if l1[i] == l2[j]:
found = True
k = j
break
if found == True:
l2[k] = None
else:
OK = False
return OK
def judgeStr_3(s1, s2): # 空间换时间:26个字母对应一个长为26的数组,数组上的数字表示对应字母在s1,s2中出现了几次,如果出现次数一样,则是变位次
cnt1 = [0] * 26
cnt2 = [0] * 26
l1 = list(s1)
l2 = list(s2)
if len(l1) != len(l2):
return False
# python中获取ASCII值的函数 ,ord=ordinal(序数的,顺序的)
for i in range(len(l1)):
cnt1[ord(l1[i])-ord('A')] += 1
for i in range(len(l2)):
cnt2[ord(l2[i])-ord('A')] += 1
OK = True
for i in range(len(cnt2)):
if cnt1[i] == cnt2[i]:
continue
return False
return True
s1 = "ABCDEFG"
s2 = "BACFEGD"
result1 = judgeStr_1(s1, s2)
result2 = judgeStr_2(s1, s2)
result3 = judgeStr_3(s1, s2)
print(result1, result2, result3)
如果这篇文章帮助到了你,你可以请作者喝一杯咖啡

浙公网安备 33010602011771号