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
相关产品推荐
相关产品推荐

