检查两个词是否是“变位词”

需求

  • 需求:检查两个词是否是“变为词”(变位词:两个词是有相同的字母不同的排序组成,例如:earth和heart,python和typhon)
  • 输入:两个单词
  • 输出:0或者1,0:表示不是变位词,1:两个词是变位词

方法1

# 方法一
def check_word01(world01, world02):
    """时间复杂度:O(n)"""
    flag = 1  # 默认是变位词
    if len(world01) != len(world02):  # 检查长度是否相同
        flag = 0
    if  flag:
        for i in list(world01):  # 检查word1中的字符是否都在word2中
            if world02.find(i) == -1:
                flag = 0
                break
        if flag:
            for j in list(world02):  # 检查word2中的字符是否都在word1中
                if world01.find(j) == -1:
                    flag = 0
                    break
    return flag

print(check_word01("earth", "heart"))
print(check_word01("python", "typhon"))

方法2

# 方法二
def check_word02(word01, word02):
    """时间复杂度:O(n*logN)"""
    # 先排序,再对比
    flag = 1  # 默认是变位词
    if len(word01) != len(word02):
        flag = 0
    if flag:
        list01 = list(word01)
        list02 = list(word02)
        list01.sort()  # 排序不是一步,是n*logN
        list02.sort()
        if list01 != list02:
            flag = 0
    return flag


print(check_word02("earth", "heaart"))
print(check_word02("python", "typhon"))

方法3

# 方法三
def check_word03(word01, word02):
    """暴力法:先将word01中的字母进行全排(n!)得到一个所有可能的结果列表,再判断word02是否在该结果列表中。
        该算法的复杂度为:2^n
        算法复杂度太高,不是一个好的算法
    """
    pass

方法4

# 方法四
def check_word04(word01, word02):
    """"
    思路:用计数器分别记录word01和word02在26个英文字母中出现的次数,在对比计数器结果。
    算法复杂度:O(1)
    T(n) = 3 + 26 + 26 + 1 = 56,就本方法而言算法复杂度应该为O(1)
    """
    str_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
                'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    counter01 = {}
    counter02 = {}
    for i in str_list:
        counter01[i] = word01.count(i)
    for i in str_list:
        counter02[i] = word02.count(i)
    if counter01 == counter02:
        return 1
    else:
        return 0


print(check_word04("earth", "heaart"))
print(check_word04("python", "typhon"))
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值