给定一个字符串 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
由英文字母、数字、符号和空格组成
示例演示:s = "abcabcbb"
初始化
len = 8
(字符串长度)right = 0
(起始窗口的左边界)maxlen = 0
(记录最大长度)map
初始化为大小为 128 的向量,所有元素为 0
第一步:left = 0 (字符 'a')
right = max(0, map['a']) = 0
(由于 'a' 尚未记录,right
保持不变)map['a'] = 1
(更新 'a' 的位置为当前位置的下一个索引)maxlen = max(0, 0 - 0 + 1) = 1
(当前窗口大小为 1)
第二步:left = 1 (字符 'b')
right = max(0, map['b']) = 0
(由于 'b' 尚未记录,right
保持不变)map['b'] = 2
maxlen = max(1, 1 - 0 + 1) = 2
第三步:left = 2 (字符 'c')
right = max(0, map['c']) = 0
(由于 'c' 尚未记录,right
保持不变)map['c'] = 3
maxlen = max(2, 2 - 0 + 1) = 3
第四步:left = 3 (字符 'a')
right = max(0, map['a']) = 1
(发现 'a' 之前记录的位置是 1,更新right
)map['a'] = 4
maxlen = max(3, 3 - 1 + 1) = 3
接下来的步骤
- 每次迭代会更新
right
指针以确保窗口中不出现重复字符。 map
数组记录每个字符的最新位置加一。maxlen
保持更新为窗口的最大长度。
结论
通过整个字符串的遍历,计算出无重复字符的最长子串长度为 3,对应的子串为 "abc" 或 "bca"。这种方法有效利用了数组索引作为字符的哈希表,并通过更新 right
指针来有效地管理窗口大小,从而在 O(n) 时间复杂度内解决问题。