本页目录
3.无重复字符的最长子串
题目
LeetCode 中等
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个 子序列,不是子串。
题解
方法:Set + 双指针 + 滑动窗口
双指针
滑动窗口
Set
O(n) O(set 长度)
js
function lengthOfLongestSubstring(s) {
const sLen = s.length
if (sLen < 2) return sLen
const tempSet = new Set()
let maxLen = 0
let l = 0
for (let r = 0; r < sLen; r++) {
const cur = s[r]
console.log(r, cur)
//从左指针的字符开始删,一直删到Set里没有当前字符
while (tempSet.has(cur)) {
const lStr = s[l]
console.log('左指针:', l, lStr)
tempSet.delete(lStr)
++l
}
tempSet.add(cur)
maxLen = Math.max(maxLen, tempSet.size)
console.log('左指针:', l, ',最长:', maxLen)
console.log(tempSet)
}
return maxLen
}
console.log('🌰', lengthOfLongestSubstring('pwwkew'))
执行结果
0 p
左指针: 0 ,最长: 1
Set(1) { 'p' }
1 w
左指针: 0 ,最长: 2
Set(2) { 'p', 'w' }
2 w
左指针: 0 p
左指针: 1 w
左指针: 2 ,最长: 2
Set(1) { 'w' }
3 k
左指针: 2 ,最长: 2
Set(2) { 'w', 'k' }
4 e
左指针: 2 ,最长: 3
Set(3) { 'w', 'k', 'e' }
5 w
左指针: 2 w
左指针: 3 ,最长: 3
Set(3) { 'k', 'e', 'w' }
🌰 3
方法:Map + 双指针 + 滑动窗口
双指针
滑动窗口
Map
O(n) O(map 长度)
js
function lengthOfLongestSubstringUseMap(s) {
const sLen = s.length
const map = new Map()
let maxLen = 0
let l = 0
for (let r = 0; r < sLen; r++) {
const cur = s[r]
console.log(r, cur)
//map记录每个字符最新的位置,左指针可以直接指向后一位,不需要向上面Set那样循环删除
if (map.has(cur) && map.get(cur) >= l) {
l = map.get(cur) + 1
}
map.set(cur, r)
maxLen = Math.max(maxLen, r - l + 1)
console.log('左指针:', l, ',最长:', maxLen)
console.log(map)
}
return maxLen
}
console.log('🌰', lengthOfLongestSubstringUseMap('abcabcbb'))
执行结果
0 a
左指针: 0 ,最长: 1
Map(1) { 'a' => 0 }
1 b
左指针: 0 ,最长: 2
Map(2) { 'a' => 0, 'b' => 1 }
2 c
左指针: 0 ,最长: 3
Map(3) { 'a' => 0, 'b' => 1, 'c' => 2 }
3 a
左指针: 1 ,最长: 3
Map(3) { 'a' => 3, 'b' => 1, 'c' => 2 }
4 b
左指针: 2 ,最长: 3
Map(3) { 'a' => 3, 'b' => 4, 'c' => 2 }
5 c
左指针: 3 ,最长: 3
Map(3) { 'a' => 3, 'b' => 4, 'c' => 5 }
6 b
左指针: 5 ,最长: 3
Map(3) { 'a' => 3, 'b' => 6, 'c' => 5 }
7 b
左指针: 7 ,最长: 3
Map(3) { 'a' => 3, 'b' => 7, 'c' => 5 }
🌰 3