“变位词”判断问题

“变位词”是指两个词之间存在组成字母的重新排列关系

如: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"))

优点:时间复杂度小

缺点:需要申请额外的空间定义计数器,计数器越大所需要的空间就越多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值