剑指 Offer 48. 最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
采用双指针滑动窗口的思想来解决问题
right指针往右走
若right指针指向的元素未在set中出现,则right++,并且更新maxlen
若right指针指向的元素在set中出现了,则left++,并且清除set中s[left];
循环操作
set操作
set<char> window;
window.insert(x);
window.erase(x);
window.find(x)==window.end() //未找到该元素
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left = 0;
int right = 0;
int maxlen = 0;
set<char> window;
while(right<s.size()){
if(window.find(s[right])==window.end()){
window.insert(s[right]);
right++;
maxlen = max(right-left,maxlen);
}
else{
// while(window.find(s[right])!=window.end()){
// window.erase(s[left]);
// left++;
// }
// window.insert(s[right]);
// right++;
window.erase(s[left]);
left++;
}
}
return maxlen;
}
};