如何用纯JavaScript编写Isogram判断函数并优化现有实现
优化Isogram判断函数的几种方案
嘿,我来帮你优化这个判断Isogram的函数!首先先明确下你定义的Isogram是包含重复字符的单词(注意通常标准Isogram指的是无重复字符的单词,不过这里完全按照你的需求来)。
先说说你提供的原代码存在的几个问题:
- 变量
x、y、i都没有用let/const声明,会污染全局作用域,容易引发意外bug - 循环中每次调用
substring截取子串会产生额外的性能开销 - 最后返回
x&&y的逻辑有问题:它只取了最后一次循环的结果,比如像"hello"这种前面字符有重复但最后一个字符无重复的单词,原函数会错误地返回false
下面是几个更高效、更健壮的实现方案:
方案1:利用Set去重(最简洁)
Set会自动移除重复元素,我们只需要比较原字符串长度和Set的大小即可:
function isIsogram(word) { // 如果需要区分大小写,去掉toLowerCase()即可 const lowerCaseWord = word.toLowerCase(); // 原长度大于Set长度,说明存在重复字符,返回true return lowerCaseWord.length !== new Set(lowerCaseWord).size; }
优点:代码极度简洁,时间复杂度O(n),空间复杂度O(n),可读性强。
方案2:使用对象记录已出现字符(提前终止,效率更高)
遍历字符串时用对象记录已经见过的字符,一旦发现重复就立即返回结果,无需遍历整个字符串:
function isIsogram(word) { const seenCharacters = {}; const lowerCaseWord = word.toLowerCase(); for (const char of lowerCaseWord) { if (seenCharacters[char]) { // 找到重复字符,直接返回true return true; } seenCharacters[char] = true; } // 遍历完没找到重复,返回false return false; }
优点:在存在重复字符的场景下可以提前终止循环,最优时间复杂度O(1),最坏O(n),性能表现更好。
方案3:正则表达式实现(极简写法)
用正则匹配是否存在重复字符:
function isIsogram(word) { // /(.).*\1/i 匹配任意重复出现的字符,i表示不区分大小写 return /(.).*\1/i.test(word); }
优点:代码最短,但可读性对正则不熟悉的开发者稍差,适合追求极简写法的场景。
内容的提问来源于stack exchange,提问作者kishea
相关产品推荐
相关产品推荐

