【数据结构与算法-Python】变位词判断的不同方法比较

文章介绍了如何用Python判断两个词是否为变位词的四种方法,包括逐个检查、排序比较、暴力法和计数比较。逐个检查算法时间复杂度为O(n^2),排序比较为O(nlogn),暴力法为O(n!),而计数比较的效率最高,为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

所谓 “变位词” 是指两个词之间存在组成字母重新排列关系。
比如:heartearthpythontyphon

为了简单起见,假设参与判断的两个词 仅由小写字母构成,而且长度相等

编写程序,判断两个词是否为 “变位词”

二、解题思路

2.1 逐个检查

word01 的字符逐个在 word02 中检查是否存在,如果存在,就进行标记;如果每个字符都能找到,那么两个单词就是“变位词”;否则,就不是变位词。

2.1.1 算法实现

def OneByOne(word01, word02):
    L = len(word01)
    tag = [False for i in range(L)]
    lis01 = list(word01)
    lis02 = list(word02)

    for i in range(L):
        for j in range(L):
            if lis01[i] == lis02[j]:
                tag[i] = True

    if False in tag:
        return False
    else:
        return True

2.1.2 算法分析

问题规模为:字符串中包含的字符数 n

该算法有两层循环:
外层循环遍历 word01 的每个字符,并将内层循环执行 n 次;
内层循环遍历 word02 的每个字符。

进而可以得出其算法时间复杂度为 O ( n 2 ) O(n^2) O(n2)

2.2 排序比较

将两个字符串按照字符顺序排好序,再逐个对比是否相同,如果相同,则为变位词;否则就不是变位词。

2.2.1 算法实现

def Sort(word01, word02):
    lis01 = list(word01)
    lis02 = list(word02)
    lis01.sort()
    lis02.sort()
    for i in range(len(word01)):
        if lis01[i] == lis02[i]:
            continue
        else:
            return False

    return True

2.2.2 算法分析

问题规模为:字符串中包含的字符数 n

该算法只有一层循环,最多执行 n 次;
但排序算法的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),大于循环的时间复杂度 O ( n ) O(n) O(n)

由此可以得出其算法时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

2.3 暴力法

word01 中出现的字符进行全排列,再查看 word02 是否出现在全排列列表中。

2.3.1 算法实现

"""
利用itertools中的permutations函数
permutation(list)会返回一个列表,其中的元素是每一种全排列的元组
"""
from itertools import permutations
def Vio(word01, word02):
    lis01 = list(word01)
    word02 = tuple(word02)

    Perm = permutations(lis01)
    if word02 in Perm:
        return True
    else:
        return False

2.3.2 算法分析

问题规模为:字符串中包含的字符数 n

该算法的最主要部分是生成 word01 的全排列,其全排列的所有可能数为 n ! n! n!

由此可以得出其算法时间复杂度为 O ( n ! ) O(n!) O(n!)

2.4 计数比较

对比两个字符串中每个字符(字母)出现的次数,如果26个字母出现的次数都相同,那么两个字符串是变位词;否则不是变位词。

2.4.1 算法实现

def Count(word01, word02):
    count01 = [0] * 26
    count02 = [0] * 26

    for i in word01:
        pos = ord(i) - ord('a')
        count01[pos] += 1
    for i in word02:
        pos = ord(i) - ord('a')
        count02[pos] += 1

    if count01 == count02:
        return True
    else:
        return False

2.4.2 算法分析

问题规模为:字符串中包含的字符数 n

该算法的最主要部分是对字符串进行计数,操作数为字符串长度 n

由此可以得出其算法时间复杂度为 O ( n ) O(n) O(n)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四口鲸鱼爱吃盐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值