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

请教:我实现的无需排序的Anagram判断算法是否为可行方案?

关于Anagram问题的非排序解法可行性探讨

大家好,我是编程初学者,想请教在anagram问题中,不采用字符排序的解法是否可行。我看到部分教程采用字符串排序的方法,但自己编写了一套无需排序的算法,运行效果良好。附上代码:

def is_anagram(str1, str2):
    if len(str1) != len(str2):
        return False
    else:
        for i in range(len(str2)):
            if str1[i] not in str2 or str2[i] not in str1:
                return False
        return True

    return False


print(is_anagram("hey", "hey"))

该算法比教程中的方法更简洁,经测试,处理约200万长度的字符串时耗时仅1秒,希望得到各位的专业意见。

首先明确:非排序解法完全可行,这类解法在实际开发中很常见,甚至性能表现优于排序法。不过你的当前实现存在两个核心问题,需要注意:

1. 逻辑存在漏洞,无法覆盖所有Anagram场景

你的算法仅检查了每个位置的字符是否存在于另一个字符串,但没有统计字符出现的次数。比如测试用例is_anagram("aab", "abb"),你的代码会错误返回True,但这两个字符串显然不是Anagram——前者包含2个a和1个b,后者是1个a和2个b。

2. 时间复杂度较高,最坏场景下性能会急剧下降

每次执行str1[i] not in str2都是O(n)的遍历操作,因此整个算法的时间复杂度是O(n²)。你测试的200万长度字符串耗时1秒,大概率是测试场景比较特殊(比如两个字符串完全相同),但如果遇到字符分布分散或次数不匹配的情况,耗时会大幅增加。

推荐的非排序正确实现:字符频率统计法

这种方法通过哈希表(字典)统计每个字符的出现次数,时间复杂度为O(n),空间复杂度为O(k)(k为字符集大小),既保证正确性又高效:

def is_anagram(str1, str2):
    if len(str1) != len(str2):
        return False
    char_count = {}
    # 统计第一个字符串的字符频率
    for char in str1:
        char_count[char] = char_count.get(char, 0) + 1
    # 遍历第二个字符串,抵消频率
    for char in str2:
        if char not in char_count or char_count[char] == 0:
            return False
        char_count[char] -= 1
    return True

总结:非排序解法是Anagram问题的优选方案之一,但你的当前实现需要修正逻辑漏洞,同时优化时间复杂度。字符频率统计法是这类解法中最经典且实用的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:40:32