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

如何编写JavaScript脚本判断两个字符串是否为变位词

判断两个字符串是否互为变位词的JavaScript实现(辅助数组方案)

核心思路

变位词的本质是两个字符串包含的字符完全相同,且每个字符的出现次数一致。用辅助数组统计字符频次是高效的方案——利用字符的ASCII码作为数组索引,通过增减计数来校验频次是否匹配。

具体步骤

  1. 边界校验:如果两个字符串长度不同,直接返回false(变位词长度必然相等)。
  2. 初始化计数数组:创建一个长度为256的数组(覆盖所有ASCII字符),初始值设为0,用来记录每个字符的出现次数。
  3. 统计第一个字符串的字符频次:遍历第一个字符串的每个字符,通过charCodeAt()获取字符的ASCII码,以此为索引将数组对应位置的计数加1。
  4. 校验第二个字符串的字符频次:遍历第二个字符串的每个字符,同样通过ASCII码找到数组索引,将对应位置的计数减1。如果中途出现计数为负的情况,说明该字符在第二个字符串中出现次数更多,直接返回false。
  5. 最终校验:遍历计数数组,若所有元素都为0,说明两个字符串字符频次完全匹配,返回true;否则返回false。

代码实现

function isAnagram(str1, str2) {
    // 长度不同直接排除
    if (str1.length !== str2.length) return false;

    // 初始化ASCII字符计数数组
    const countArray = new Array(256).fill(0);

    // 统计第一个字符串的字符频次
    for (let char of str1) {
        countArray[char.charCodeAt(0)]++;
    }

    // 校验第二个字符串的字符频次
    for (let char of str2) {
        const charCode = char.charCodeAt(0);
        countArray[charCode]--;
        // 出现负数说明字符频次不匹配
        if (countArray[charCode] < 0) return false;
    }

    // 最后检查所有计数是否为0
    for (let count of countArray) {
        if (count !== 0) return false;
    }

    return true;
}

// 测试示例
console.log(isAnagram("listen", "silent")); // true
console.log(isAnagram("hello", "bello")); // false
console.log(isAnagram("aabbcc", "ccbbaa")); // true

拓展说明

  • 如果需要大小写不敏感的校验,可以在统计前将两个字符串统一转为小写(或大写):str1 = str1.toLowerCase(); str2 = str2.toLowerCase();
  • 如果需要支持非ASCII字符(如中文、特殊符号),可以调整数组长度为更大的范围,或者改用Map来统计,但辅助数组方案在ASCII场景下性能最优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:50:21