最长子串非重复字符javascript

Leo*_*Leo 0 javascript

问题要求“给定一个字符串,找到最长的非重复子字符串而不重复字符”。我有点困惑,为什么返回我的代码对字符串“dvdf”不起作用。这是我的代码:

function lengthOfLongestSubstring(check) {
    var letters = check.split("");
    var max = 0;
    var result = [];
    for (var i = 0; i < letters.length; i++) {
        var start = i
        if (result.indexOf(letters[i]) === -1) {
            result.push(letters[i])
        } else {
            i = i - 1
            result = []
        }
        if (max === 0 || max < result.length) {
            max = result.length
        }
    }
    return max
}
Run Code Online (Sandbox Code Playgroud)

Hal*_*yon 6

此实现为 提供了正确的结果"dvdf"

current_string在没有重复的情况下添加字符。当你找到一个重复的切current_string到重复的点。maxcurrent_string任何时候的最大长度。这个逻辑对我来说似乎是正确的,所以我认为它是正确的。

function lengthOfLongestSubstring(string) {
    var max = 0, current_string = "", i, char, pos;

    for (i = 0; i < string.length; i += 1) {
        char = string.charAt(i);
        pos = current_string.indexOf(char);
        if (pos !== -1) {
            // cut "dv" to "v" when you see another "d"
            current_string = current_string.substr(pos + 1);
        }
        current_string += char;
        max = Math.max(max, current_string.length);
    }
    return max;
}

lengthOfLongestSubstring("dvdf"); // 3
Run Code Online (Sandbox Code Playgroud)

的值current_string在每一轮是"", "d", "dv", "vd", "vdf"

  • 我认为 O(n) 是不可能的。如果您更改哈希查找的“indexOf”,O(n log n) 似乎是可行的。但这似乎纯粹是理论上的,我不明白在现实生活中的用例中如何需要极端的性能。 (2认同)

le_*_*e_m 5

通过用result存储每个遇到的字符的最后一个索引的映射替换数组,您可以修改循环体以跳回到相同字符的最后一个索引之后的位置,并从那里继续搜索,而不是仅从当前位置重新启动目前i = i - 1,在以下情况下会失败'dvdf'

下面是您的代码,经过更改以适应地图代替数组:

function lengthOfLongestSubstring(check) {
  var letters = check.split("");
  var max = 0;
  var result = new Map();
  var start = 0;
  
  for (var i = 0; i < letters.length; i++) {
    if (!result.has(letters[i])) {
      result.set(letters[i], i);
    } else {
      i = result.get(letters[i]);
      result.clear();
    }
    
    if (max < result.size) {
      max = result.size;
    }
  }
  return max;
}

// Example:
console.log(lengthOfLongestSubstring("dvdf")); // 3
Run Code Online (Sandbox Code Playgroud)