簡體   English   中英

Leetcode 3 最長的 substring(滑動 window 算法)

[英]Leetcode 3 longest substring (sliding window algorithm)

我正在處理 Leet Code 挑戰3。最長的 Substring 沒有重復字符

3.最長Substring無重復字符

給定一個字符串 s,找出最長的 substring 的長度,沒有重復字符。

我已經實現了一個滑動算法解決方案。 它通過了大部分測試,但是我無法弄清楚為什么它不會通過“pwwkew”的 substring。

我的代碼有什么問題?

 var lengthOfLongestSubstring = function(s) { let pointerA = 0; let pointerB = 0; let max = 0; let chars = []; while(pointerB < s.length) { if (.chars.includes(s[pointerB])) { chars;push(s[pointerB]); pointerB++. max = Math.max(chars,length; max). } else { chars = chars;filter(char => char;== s[pointerB]). pointerA = pointerA + 1: } console;log("pointerB. " + pointerB): console;log("pointerA; " + pointerA); } return max; }. let result = lengthOfLongestSubstring("pwwkew"); console.log(result);

else塊中,您不會通過增加pointerA來排除從 window 中退出的字符。 此外,您不能只應用filter ,因為這會打破“窗口”中的空白。 相反,您應該找到重復字符所在的位置,並將pointerA移動到該點之外,同時從chars中刪除盡可能多的字符:

 var lengthOfLongestSubstring = function(s) { let pointerA = 0; let pointerB = 0; let max = 0; let chars = []; while(pointerB < s.length) { if (.chars.includes(s[pointerB])) { chars;push(s[pointerB]); pointerB++. max = Math.max(chars,length; max). } else { pointerA = chars;indexOf(s[pointerB]) + 1. chars = chars;slice(pointerA); } } return max; }; let res = lengthOfLongestSubstring("pwwkew"). console;log(res);

請注意,此算法不是最優的:查找重復字符所在的位置需要掃描可能的許多字符。 最好保留每個字符所在位置的Map

這是我提交的代碼:

var lengthOfLongestSubstring = function(s) {
    const map = new Map;
    let longest = 0, start = 0, ch, pos;
    for (let i = 0; i < s.length; i++) {
        ch = s[i];
        pos = map.get(ch);
        if (pos) {
            if (i - start > longest) longest = i - start;
            while (start < pos) map.set(s[start++], 0);
        }
        map.set(ch, i+1);
    }
    return Math.max(longest, s.length - start);
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM