判断两字符串是否为乱序字符串(Python3实现)

本文介绍了四种方法来判断两个字符串是否为乱序字符串,包括穷举法、字符出现次数对比、排序比较以及利用计数列表。重点讨论了算法的时间复杂度,其中计数列表方法能在线性时间复杂度内解决问题。

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

乱序字符串定义
显示不同量级的算法的一个很好的例子是字符串的乱序检查。乱序字符串是指一个字符串只是另一个字符串的重新排列。例如,‘heart’ 和’earth’ 就是乱序字符串。‘python’ 和 ‘typhon’ 也是。为了简单起见,我们假设所讨论的两个字符串具有相等的长度,并且他们由 26 个小写字母集合组成。我们的目标是写一个布尔函数,它将两个字符串做参数并返回它们是不是乱序。

求解方法

解法1
采用穷举法。穷举s1所有的排列方式,判断s2是否属于其中。当s1生成所有排列方式时,第一个位置有n种可能,第二个位置有n-1种,以此类推,所以算法时间复杂度是O(n!)O(n!)O(n!),不可取。

解法2
检查s1中的每一个字符是否出现在s2中,如果均可检测到,则为乱序。可在检测过程中将出现在第s2中的对应字符删除。代码如下

def nagramSolution2(s1,s2):
    alist = list(s2) #将字符串2转化为列表(可变数据类型,方便进行删除操作)
    pos1 = 0
    still_ok = True
    
    while pos1 < len(s1) and still_ok:
        pos2 = 0
        found = False
        while pos2 < len(alist) and not found:
            if s1[pos1] == alist[pos2]:
                found = True #在该位置找到对应字符,根据条件跳出内循环
                alist.pop(pos2) #将列表对应字符删除
            else:
                pos2 += 1
            
        if not found:
            still_ok = False #s1中的某一字符未在s2对应的列表里出现,根据条件退出大循环,返回False
            
        pos1 += 1
    return still_ok   

该算法包含内外

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值