【问题标题】:Longest Substring Without Repeating Characters corner cases没有重复字符的最长子串极端情况
【发布时间】:2016-06-09 09:18:38
【问题描述】:

我在最近的一次采访中被问到这个问题。我需要找到最长的substring 而不重复字符。

给定“abcabcbb”,答案是“abc”,长度为3。

给定“bbbbb”,答案是“b”,长度为1。

给定“pwwkew”,答案是“wke”,长度为3

这是我想出来的,我认为它可以正常工作,但面试官并没有留下深刻的印象,并说我的解决方案可能不适用于所有情况。

    var str = "pwwkew";
    var longSubstring = function(str) {
      var obj = {}; //map object
      var count = 0;
      var c = []; //count array to keep the count so far
      for (var i = 0; i < str.length; ++i) {
        //check if the letter is already in the map
        if (str[i] in obj && obj[str[i]] !== i) {
          c.push(count); //we encountered repeat character, so save the count
          obj = {};
          obj[str[i]] = i;
          count = 1;
          continue;
        } else {
          obj[str[i]] = i;
          ++count;
        }
      }
      return Math.max.apply(null, c);
    }
    console.log(longSubstring(str)); //prints 3

谁能告诉我我的解决方案有什么问题?我认为它是最好的之一:) 并且在O(n) 时间也可以解决。

【问题讨论】:

  • 什么是“aaaabbbbaaaabbbbaaaabbbb”返回?
  • @e4en 它应该返回 2。任何 ab、ba...我的代码也适用于此
  • @WildWidow 。如果输入是“abc”,输出会是什么。它返回 -Infinity
  • @WildWidow:这个帖子似乎有更好的方法。请看这个stackoverflow.com/questions/9734474/…
  • 您的解决方案可能工作正常,但我认为它不是 O(n) 时间解决方案。你做了 n 次str[i] in obj 操作。

标签: javascript arrays string time-complexity asymptotic-complexity


【解决方案1】:

我猜你的代码的问题是,当整个句子中没有重复的字母开始时,它会变得混乱。如其中一个 cmets "abc" 中所述,不会产生正确的结果。我的方法与您的方法略有不同,如下所示;

var str = "pwwkew",
   data = Array.prototype.reduce.call(str, (p,c) => (p.test.includes(c) ? p.test = [c]
                                                                        : p.test.length >= p.last.length ? p.test = p.last = p.test.concat(c)
                                                                                                         : p.test.push(c)
                                                                        , p), {last:[], test:[]}),
result = data.last.length;
console.log(data);
console.log(result);

在这个reduce 代码中,我们最初从{last:[], test:[]} 之类的对象开始,并逐个检查字符。如果接收到的字符在我们对象的test 数组中,我们立即重置test 数组以仅包含我们测试的字母(p.test = [c] 行)。但是,如果接收到的字符不在我们的 test 数组中,那么我们将执行以下两件事之一。如果我们的test 数组的长度等于或长于last 数组的长度,那么我们将当前字符添加到test 数组并使得last 数组=test 数组。 (p.test.length &gt;= p.last.length ? p.test = p.last = p.test.concat(c) 行)。但是,如果我们的 test 数组的长度比 last 数组的长度短,我们只需将当前字符添加到 test 数组中,并以同样的方式一个接一个地继续到字符串的末尾。

【讨论】:

    猜你喜欢
    • 2018-03-26
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2022-08-14
    • 1970-01-01
    相关资源
    最近更新 更多