判断两个字符串是否互为变形词

本文介绍了一种用于判断两个字符串是否互为变形词的算法。通过统计字符种类和数量,对比两个字符串,确保它们的字符组成完全一致。文章提供了两种实现方式,一种针对ASCII字符,另一种适用于所有Unicode字符。

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

判断两个字符串是否互为变形词

判断两个字符串是否互为变形词

【题目】
给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1与str2互为变形词
请实现函数判断两个字符串是否互为变形词
是变形词返回True,不是变形词返回False。
【举例】
str1=“123”,str2=“231”,返回True。
str1=“123”,str2=“2331”,返回False。

算法思路

统计字符串str1的种类及数量,再与str2进行对比。

  1. 比较字符串长度,长度不同,则返回False;
  2. 统计str1,字符及对应数量递增;
  3. 对比str2,字符及对应数量递减;
  4. 对比过程中,发现字符种类不存在或者数量递减至负数,则返回False;
  5. 对比完成,两者字符串长度相同,又不存在字符种类不同及数量不对齐情况,则说明两者互为变形词,返回True。

若字符串只包含ASCII字符,可创建长度为256的数组统计其数量(索引为字符在ASCII上对应的编码),见is_deformed_ascii_str(s1, s2)
若字符串包含广义unicode字符,可创建散列表(python对应实现为字典),存储键值对(字符种类——数量),见is_deformed_str(s1, s2)

相应代码

# 判断两个由ASCII字符构成的字符串是否互为变形词
def is_deformed_ascii_str(s1, s2):
    if len(s1) == 0 or len(s2) == 0 or len(s1) != len(s2):
        return False
    arr = [0 for i in range(256)]
    for i in range(len(s1)):
        arr[ord(s1[i])] += 1
    for i in range(len(s2)):
        arr[ord(s2[i])] -= 1
        if arr[ord(s2[i])] < 0:
            return False
    return True

# 判断两个字符串是否互为变形词
def is_deformed_str(s1, s2):
    if len(s1) == 0 or len(s2) == 0 or len(s1) != len(s2):
        return False
    d = {}  # 字符-次数 字典
    for i in range(len(s1)):
        d[s1[i]] = d.get(s1[i], 0) + 1
    for i in range(len(s2)):
        d[s2[i]] = d.get(s2[i], 0) - 1
        if d[s2[i]] < 0:
            return False
    return True

# 简单测试
if __name__ == '__main__':
    print(is_deformed_ascii_str('123', '231'))  # True
    print(is_deformed_ascii_str('123', '2331'))  # False
    print(is_deformed_ascii_str('1231', '2131'))  # True

    print(is_deformed_str('123', '231'))  # True
    print(is_deformed_str('123', '2331'))  # False
    print(is_deformed_str('1231', '2131'))  # True

有任何疑问和建议,欢迎在评论区留言和指正!

感谢您所花费的时间与精力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值