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

如何用纯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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:23:45