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

如何实现检测两列表中是否存在互为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:01:13