JS Li Kou の古典的な 100 の質問 - 繰り返し文字を含まない最長の部分文字列

文字列 s が与えられた場合、繰り返し文字を含まない最長の部分文字列の長さを見つけてください。

例 1:

入力: s = "abcabcbb"
出力: 3
説明: 繰り返し文字を含まない最長の部分文字列は「abc」であるため、その長さは 3 です。

例 2:

入力: s = "bbbbb"
出力: 1
説明: 繰り返し文字を含まない最長の部分文字列は "b" であるため、その長さは 1 です。

例 3:

入力: s = "pwwkew"
出力: 3
説明: 繰り返し文字を含まない最長の部分文字列は「wke」であるため、その長さは 3 です。
     答えは部分文字列の長さでなければならないことに注意してください。「pwke」は部分文字列ではなく部分列です。

ヒント:

    0 <= s.length <= 5 * 104
    s は英語の文字、数字、記号、スペースで構成されます

 うーん...テストケースプログラミングに頼って、ようやく理解できました

 アイデア:map は異なる部分文字列を保存し、重複が見つかった場合は i と Index のマップ要素を削除します。配列を使用して各部分文字列の長さを格納し、最後に配列内の最大のツリー値を持つ要素を返します。

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let i =0
    let arr=[]
    const map = new Map()
    map.set(s[0],0)
    if(s.length == 0){
        return 0
    }
    if(s.length ==1){
        return 1
    }
    let j=1
    while((i<s.length) && (j<s.length)){
        if(!map.has(s[j])){
            map.set(s[j],j)
            j++
        } else {
            let index = map.get(s[j])
            arr.push(j-i)
            for(let k=i; k<=index; k++){
                map.delete(s[k])
            }
            i = index+1
            map.set(s[j],j)
            j++
        }
    }
    arr.push(j-i)
    let max=0
    for(let m=0; m <arr.length; m++) {
        if(arr[m] >max){
            max = arr[m]
        }
    }
    return max
};

おすすめ

転載: blog.csdn.net/qq_36384657/article/details/128172147