题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长
子串
****的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
思路
1、使用双指针扫描 left->right 区间
2、使用 map 记录已经扫描过的字符
3、如果遍历到 right 时,发现该字符已经处理过了,那么说明 [left, right) 是合法的无重复子串
4、如果是最长无重复子串更新之
优化:使用固定长度数组代替性能相对较差的 map
代码 1
func lengthOfLongestSubstring(s string) int {
var l, r, n, ans int
l, r, n = 0, 0, len(s)
m := map[byte]int{}
for r < n {
if j, ok := m[s[r]]; ok {
l = max(l, j+1)
}
ans = max(ans, r-l+1)
m[s[r]] = r
r++
}
return ans
}
why l = max(l, j+1)
状态转移图
代码 2
func lengthOfLongestSubstring(s string) int {
var bitMap [256]bool
var l, r, n, ans int
n = len(s)
for r < n {
for l < r && bitMap[s[r]] {
bitMap[s[l]] = false
l++
}
ans = max(ans, r-l+1)
bitMap[s[r]] = true
r++
}
return ans
}