给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
例子:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
int lengthOfLongestSubstring(string s) {
map<char, int>m;
int ans = 0;
int start = 0;
for (int end = 0; end < s.size(); end++)
{
if (m.find(s[end]) != m.end())
{
start = std::max(start, m[s[end]]);//如果end指向元素在map中,则更新start
}
ans = std::max(ans, end - start + 1);
m[s[end]] = end + 1;
}
return ans;
}
这道题使用滑窗+双指针的方法。
定义一个 map 数据结构存储 (k, v),其中 key 值为字符,value 值为字符位置 +1,因为加 1 表示从字符位置后一个才开始不重复
双指针 start 和 end,随着 end 不断遍历向后,如果 end 对应的字符不在 [start, end-1] 区间内,则把该字符加入 map 结构。如果 end 对应的字符不在 [start, end-1] 区间内,此时将字符作为 key 值,获取其 value 值,并更新 start,这里为什么需要比较start 和 m[s[end]]呢?因为重复字符可能在 start 之前,因而 start 值不变。更新 start 后此时 [start, end] 区间内不存在重复字符