3. 無重複字符的最長子串

題目:給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。測試

示例 1:優化

輸入: "abcabcbb"
輸出: 3
解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3。spa

示例 2:code

輸入: "bbbbb"
輸出: 1
解釋: 由於無重複字符的最長子串是 "b",因此其長度爲 1。圖片

示例 3:leetcode

輸入: "pwwkew"
輸出: 3
解釋: 由於無重複字符的最長子串是 "wke",因此其長度爲 3。字符串

請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

解答:
1.暴力破解string

var lengthOfLongestSubstring = function(s) {
    var l = s.length;
    var re = 0;
    for (var i= 0; i < l; i++) { //1
        for(var j = i + 1; j <= l; j++){ //2
           if(check(i, j)) {
               re = Math.max(re, j - i)
           } else {
               break
           }
        }
    }
    function check(start, end) {
        var a  = [];
        for (var k = start; k < end; k++) { //3
            if (a.indexOf(s[k]) !== -1) {
                return false
            } else {
                a.push(s[k])
            }
        }
        return true;
    }
    return re
};

上來就是一頓for循環操做,這樣暴力寫咱們的leetcode確定是不會給過的,由於遇到超級長的字符串測試用例,執行時間會超出時間限制,上面代碼的優化空間很大。
理一下邏輯,咱們每次在2裏面檢測出有重複的字符時,記錄這個重複字符前一次出現的位置index,而後中斷此次循環,開始下一次1的循環,而且i的位置應該爲index+1。
圖片描述
好比在i=0的時,在2循環裏j=4時就會出現重複的字符d,字符d前一次出現的位置是1,這時最長字符串長度是4,而且被記錄,這時應該開始1循環的下一次循環,而且是從i=2開始。
3循環和2循環實際上是沒必要要的,咱們建立一個動態的字符串,把每次循環到的字符加進去並實時記錄它的長度,遇到重複的字符串就砍掉字符第一次出現跟它以前的字符串,好比上圖,i循環到4時,出現重複字符d,d在以前出現的位置是1,咱們應該砍掉動態字符串位置1跟它以前的字符串,來保證它是無重複的字符串。代碼以下it

var lengthOfLongestSubstring = function(s) {
    var l = s.length;
    var re = 0;
    var a = '', index;
    for (var i = 0; i < l; i++) {
        index = a.indexOf(s[i])
        if (index !== -1) {
            a = a.slice(index + 1)
        }
        a+=s[i]
        re = Math.max(re, a.length);
        
    }

    return re
};

圖片描述
一下從矮窮挫變成高富帥,速度槓槓噠!io

相關文章
相關標籤/搜索