“变位词”是指两个词之间存在组成字母的重新排列关系
如:heart和earth,python和typhon
解题目标:判断输入的两个词是否为变位词
解法一:
逐字检查法
思路:将词1的字符逐个到词2中检查,检查在词2中是否有重复,若存在就进行标记操作
代码展示:
def judgingPosChangedWord():
# 输入词1和词2
w_input1 = input("请输入要判别的词1:")
w_input2 = input("请输入要判别的词2:")
# 判别是否是一对变位词
w1 = list(w_input1)
w2 = list(w_input2)
for pointer in w1:
for element in w2:
if pointer == element:
w2.remove(element) # 将相同元素删除,下次将不会被匹配到
else:
continue
# 输出
if len(w2) == 0:
print(f"{w_input1}和{w_input2}是一对变位词!")
else:
print(f"{w_input1}和{w_input2}不是一对变位词!")
# 调用函数
judgingPosChangedWord()
缺点:时间复杂度较大
解法二:
排序比较法
思路:调用排序函数,先把两个词进行排序,统计排序后的元素顺序是否相同
代码展示:
# 判别是否为变位词(排序比较法)
# 定义函数
def judgingPosChangedWord2(w1,w2):
original_w1 = w1
original_w2 = w2
# 转变数据类型为列表
w1 = list(w1)
w2 = list(w2)
# 进行排序
w1.sort()
w2.sort()
# 定义其他变量
pointer = 0
matches = True
# 将排序好的w1和w2进行比较
while pointer < len(w2) and matches: # 因为pointer和w2都是从0开始,所以pointer要到len(w2)-1处结束
if w1[pointer] == w2[pointer]: # 判断pointer处的元素是否相等
pointer += 1
else:
matches = False
if matches == False:
print(f"{original_w1}和{original_w2}不是一对变位词")
else:
print(f"{original_w1}和{original_w2}是一对变位词")
# 测试
judgingPosChangedWord2("heart","earth")
缺点:时间复杂度较大
解法三:
计数比较法
思路:定义两个计数器,统计元素在计数器中的位置,若相同则这两个词是变位词
代码展示:
def judgingPosChangedWord3(w1,w2):
# 设置两个计数器,用于统计w1和w2中各元素出现的次数
c1 = [0] * 26
c2 = [0] * 26
# 统计w1中各元素出现的次数
for i in range(len(w1)):
pointer = ord(w1[i]) - ord("a")
c1[pointer] = c1[pointer] + 1 # 找到元素在计数器中的位置,并统计元素在遍历的过程中出现的次数
# 统计w2中各元素出现的次数
for i in range(len(w2)):
pointer = ord(w2[i]) - ord("a")
c2[pointer] = c2[pointer] + 1
j = 0
matches = True
while j < 26 and matches:
if c1[j] ==c2[j]:
j = j + 1
else:
matches = False
return matches
print(judgingPosChangedWord3("ate","eat"))
优点:时间复杂度小
缺点:需要申请额外的空间定义计数器,计数器越大所需要的空间就越多