如何实现检测两列表中是否存在互为anagram的单词?
解决跨列表变位词对检测问题
你的现有代码逻辑不对——当前代码是把整个列表排序后比较,这只能判断两个列表是否是彼此的元素排列,完全不符合你要找跨列表存在任意一对变位词的需求。
正确思路
要高效解决这个问题,核心是先把其中一个列表的所有单词转换成「变位词唯一标识」,然后快速检查另一个列表的单词是否能匹配到这个标识:
- 变位词的本质是字符组成完全相同,所以可以用排序后的字符串作为标识(比如"dog"和"god"排序后都是"dgo");
- 或者用字符计数的元组(比如统计字符频率后转成有序元组),这种方式对长字符串效率更高。
代码实现
方法1:用排序生成标识(简单直观)
def anagram_pair_exists(words1, words2): # 先把words1的所有单词转换成排序后的字符串,存入集合 word_signatures = set() for word in words1: # 排序后转成字符串,作为变位词的唯一标识 signature = ''.join(sorted(word)) word_signatures.add(signature) # 遍历words2的每个单词,检查是否有匹配的标识 for word in words2: current_signature = ''.join(sorted(word)) if current_signature in word_signatures: return True # 遍历完都没找到,返回False return False
方法2:用字符计数生成标识(高效处理长单词)
如果你的列表里有很长的单词,用字符频率统计会比排序更高效:
from collections import Counter def anagram_pair_exists(words1, words2): # 把字符计数结果转换成可哈希的有序元组,存入集合 word_signatures = set() for word in words1: # 对Counter的键值对排序,保证相同变位词的标识一致 signature = tuple(sorted(Counter(word).items())) word_signatures.add(signature) for word in words2: current_signature = tuple(sorted(Counter(word).items())) if current_signature in word_signatures: return True return False
测试你的示例
- 测试1:
words1 = ["dog", "kitten"],words2 = ["tiger", "god"]
"dog"的标识是"dgo","god"的标识也是"dgo",函数返回True,符合预期。 - 测试2:
words1 = ["doggy", "cat", "tac"],words2 = ["tiger", "lion", "dog"]
words1的标识是"dggoy"、"act"、"act";words2的标识是"egirt"、"ilno"、"dgo",没有重叠,函数返回False,符合预期。
内容的提问来源于stack exchange,提问作者mlenthusiast
相关产品推荐
相关产品推荐

