You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python变位词判断实现及字典键值相等校验问题咨询

变位词判断问题修复与方案扩展

第一种方案错误原因与字典正确比较方法

原第一种方案的校验逻辑存在核心缺陷:仅遍历第一个字典的第一个键值对就直接返回结果,既没有完成全量键值对校验,也没有检查第二个字典是否存在第一个字典没有的冗余键,完全不满足字典全等校验的要求。

Python中判断两个字典的键值完全一致,最简单的方案是直接使用==运算符,Python原生会自动校验两个字典长度是否相等、所有键值对是否完全匹配,无需手动遍历。修改后的第一种方案代码如下:

def are_anagrams(sent_one,sent_two):
    sent_one=sent_one.replace(" ","").lower()
    sent_two=sent_two.replace(" ","").lower()
    # 前置优化:长度不一致直接返回False
    if len(sent_one) != len(sent_two):
        return False
    dict_of_one={}
    dict_of_two={}
    for one in sent_one:
        if one not in dict_of_one:
            dict_of_one[one] = 1
        else:
            dict_of_one[one]+=1
    for second in sent_two:
        if second not in dict_of_two:
            dict_of_two[second] = 1
        else:
            dict_of_two[second]+=1
    # 直接用==完成字典全等校验
    return dict_of_one == dict_of_two

print(are_anagrams("Elvis", "Lives")) # 输出True
print(are_anagrams("Elvis", "Live Viles")) # 输出False
print(are_anagrams("Eleven plus two", "Twelve plus one")) # 输出True
print(are_anagrams("Hot Water","Worth Coffee")) # 输出False

如果需要手动实现字典全等校验逻辑,参考写法如下:

def dict_equal(d1, d2):
    # 先校验长度是否一致
    if len(d1) != len(d2):
        return False
    # 遍历全量键值对校验
    for k, v in d1.items():
        # 用不存在的对象做哨兵,避免默认值和实际值冲突
        if d2.get(k, object()) != v:
            return False
    return True

现有其他方案优化建议

  • 第二种列表删除方案:逻辑正确但性能偏低,list.remove()是O(n)操作,整体时间复杂度为O(n²),仅适合短字符串场景。
  • 第三种哈希对比方案:存在哈希碰撞的极小概率风险,更稳妥的写法是直接对比排序后的字符串本身,无需计算哈希,修改后最后一段逻辑为return first_word == second_word即可。

更多实现方案

  • 基于collections.Counter的极简实现:Counter是Python官方提供的频率统计容器,代码简洁易读
from collections import Counter
def are_anagrams(s1, s2):
    s1_clean = s1.replace(' ', '').lower()
    s2_clean = s2.replace(' ', '').lower()
    return len(s1_clean) == len(s2_clean) and Counter(s1_clean) == Counter(s2_clean)
  • 基于数组计数的高性能方案:仅适用于纯英文字母场景,时间复杂度O(n),空间复杂度O(1),是性能最优的实现
def are_anagrams(s1, s2):
    s1 = s1.replace(' ', '').lower()
    s2 = s2.replace(' ', '').lower()
    if len(s1) != len(s2):
        return False
    count = [0] * 26
    for c in s1:
        count[ord(c) - ord('a')] += 1
    for c in s2:
        idx = ord(c) - ord('a')
        count[idx] -= 1
        if count[idx] < 0:
            return False
    return True

注意:所有变位词方案都可以加入前置长度校验,清洗后的字符串长度不一致时直接返回False,能大幅提升判断效率

内容的提问来源于stack exchange,提问作者Lima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:18:00