【问题标题】:Check if string contains no duplicate characters检查字符串是否不包含重复字符
【发布时间】:2018-01-27 16:24:14
【问题描述】:

我正在尝试检查字符串中的所有字符是否都是唯一的。以下代码不断返回true。我怀疑是if 条件一直返回false,除非排序列表中的前两个字符相同。

有人可以帮忙吗?

function checkifStringisUnique (str) {
  var chars = str.split('')
  var sortedChars = chars.sort()
  console.log(sortedChars)
  console.log(sortedChars.length)

  for (i=0; i < sortedChars.length; i++) {
    if (sortedChars[i] === sortedChars[i+1]) {
      return false
    }
    return true
  }
}

【问题讨论】:

  • “如果一个字符串是唯一的”是什么意思?你的意思是'如果字符串中的所有字符都是唯一的'?
  • 你知道,这个for循环作为一个循环是没有意义的。如果没有 for 循环部分,它实际上是相同的,因为它会立即以 return true 或 false 终止。
  • 让内置类型为您完成工作:return new Set(s).size === str.length;
  • 只是另一个提示,您需要循环直到最后一个元素之前的元素,因为您检查下一个元素。

标签: javascript arrays string sorting


【解决方案1】:

您的return true 声明放错了位置。它应该在函数的末尾,但在 for 循环的末尾。

这意味着除非排序字符串的前两个字符相同,否则它总是会错误地返回true

function checkifStringisUnique (str) {
  var chars = str.split('')
  var sortedChars = chars.sort()
  console.log(sortedChars)
  console.log(sortedChars.length)

  for (i=0; i < sortedChars.length; i++) {
    if (sortedChars[i] === sortedChars[i+1]) {
      return false
    }
  }

  return true
}

其他一些杂项:

  1. 你应该使用分号
  2. 您应确保声明变量,以免它们被提升到全局范围内(例如 var i=0i=0
  3. 您应该在倒数第二个元素处停止循环,否则您将尝试访问超出sortedChars 范围的元素
  4. 考虑对非常大的字符串进行排序时会发生什么,以及这将如何影响函数的运行时间

【讨论】:

  • 非常感谢您的及时帮助!完全错过了!
【解决方案2】:

使用Set 存储唯一值并将其size 与字符串的length 进行比较。

function checkifStringisUnique (str){
    var st = new Set();
    for(var i=0; i<str.length;i++)
      st.add(str[i]);

    console.log(str, "is unique: ",str.length == st.size);
}

checkifStringisUnique("abacd"); // false
checkifStringisUnique("abcd");  // true

【讨论】:

  • 我喜欢这种方法 - 非常优雅且易于理解
【解决方案3】:

您可以使用单个循环和哈希表来存储找到的字符。

function checkifStringisUnique(str) {
    var hash = Object.create(null);

    return str.split('').every(function (c) {
        return !hash[c] && (hash[c] = true);
    });
}

console.log(checkifStringisUnique('abc'));
console.log(checkifStringisUnique('aab'));

【讨论】:

    【解决方案4】:

    观察

    • return true 必须在您的 for-loop 之外。

    这是您的修复代码。但是,它仍然有点错误,因为您正在与 sortedChars[i + 1] 进行比较,可能是 sortedChars[N + 1] = undefined

    function checkifStringisUnique(str) {
      var chars = str.split('')
      var sortedChars = chars.sort()
      console.log(sortedChars)
      console.log(sortedChars.length)
    
      for (i = 0; i < sortedChars.length; i++) {
        console.log(sortedChars[i + 1]);
        if (sortedChars[i] === sortedChars[i + 1]) {
          return false
        }
      }
    
      return true
    }
    
    console.log(checkifStringisUnique('elzo'));

    这是一种更好的方法和花哨的代码:

    • 在您的for-loop 中使用i &lt; sortedChars.length - 1,因为您不需要将最后一个字符与N+1 进行比较。

    function checkifStringisUnique(str) {
      var chars = str.split('')
      var sortedChars = chars.sort()
      console.log(sortedChars)
      console.log(sortedChars.length)
    
      for (i = 0; i < sortedChars.length - 1; i++) {
        console.log(sortedChars[i + 1]);
        if (sortedChars[i] === sortedChars[i + 1]) {
          return false
        }
      }
    
      return true
    }
    
    console.log(checkifStringisUnique('elzo'));
    console.log(checkifStringisUnique('eleazar'));

    如您所见,现在您的循环没有与索引N+1 进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 2013-10-26
      • 1970-01-01
      • 2019-06-06
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多