如何编写JavaScript脚本判断两个字符串是否为变位词
判断两个字符串是否互为变位词的JavaScript实现(辅助数组方案)
核心思路
变位词的本质是两个字符串包含的字符完全相同,且每个字符的出现次数一致。用辅助数组统计字符频次是高效的方案——利用字符的ASCII码作为数组索引,通过增减计数来校验频次是否匹配。
具体步骤
- 边界校验:如果两个字符串长度不同,直接返回
false(变位词长度必然相等)。 - 初始化计数数组:创建一个长度为256的数组(覆盖所有ASCII字符),初始值设为0,用来记录每个字符的出现次数。
- 统计第一个字符串的字符频次:遍历第一个字符串的每个字符,通过
charCodeAt()获取字符的ASCII码,以此为索引将数组对应位置的计数加1。 - 校验第二个字符串的字符频次:遍历第二个字符串的每个字符,同样通过ASCII码找到数组索引,将对应位置的计数减1。如果中途出现计数为负的情况,说明该字符在第二个字符串中出现次数更多,直接返回
false。 - 最终校验:遍历计数数组,若所有元素都为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
相关产品推荐
相关产品推荐

