トピック
文字列を指定して、繰り返し文字を含まない最長の部分文字列の長さを調べてください。
インスタンス
入力: "abcabcbb"
出力:3
説明:文字が繰り返されていない最長の部分文字列は "abc"であるため、その長さは3です。
入力: "bbbbb"
出力:1
説明:文字が繰り返されていない最長の部分文字列は "b"であるため、その長さは1です。
入力: "pwwkew"
出力:3
説明:文字が繰り返されていない最長の部分文字列は "wke"であるため、その長さは3です。
答えは部分文字列の長さでなければならないことに注意してください。「pwke」は部分文字列ではなく部分列です。
アイデア
- セットを作成する
- 2つのポインター(この用語で怖がらないでください)最初のポインターは文字列jの先頭を指し、2番目のポインターはforループで文字列iをトラバースします
- セットにs [i]がない場合は、これまでに繰り返し文字がないことを意味します。セットにs [i]を追加してから、一意の文字の最大数を更新してください。
- セットにs [i]がある場合は、セットからs [j]を削除し、jをインクリメントしてから、セットにs [i]があるかどうかを確認し、セットにs [i]がなくなるまで繰り返します。
- 文字列全体がトラバースされるまで、手順3と4を繰り返します。
const lengthOfLongestSubstring = s => {
// 定义两个循环变量和要输出的最大长度的变量
let i = 0 ,j = 0, maxLength = 0
const set = new Set()
//判断数组的长度为0的时候直接返回0
s.length === 0 && 0
for(i; i < s.length; i++) {
if (!set.has(s[i])) {
set.add(s[i])
maxLength = Math.max(maxLength,set.size)
}else {
while (set.has(s[i])) {
set.delete(s[j])
j++
}
set.add(s[i])
}
}
return maxmaxLength
};