双指针滑动窗口:
定义一个 set 集合,通过 left 和 right 两个指针,
right 不断向后移动,将字符放入 set 集合,当有重复值时,
将 left 右移,并删除 set 中的重复值,每次加入新的无重复值时,再次比较最大值
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.empty()) return 0;
int len = s.length();
int left = 0, right = 0;
int max_sub_len = 0;
unordered_set<int> sq;
while (right < len) {
if (sq.find(s[right]) != sq.end()) {
sq.erase(sq.find(s[left++]));
continue;
}
sq.insert(s[right++]);
max_sub_len = max(max_sub_len, right - left);
}
return max_sub_len;
}
};
利用vector代替set,O(1)时间内查找是否重复
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.empty()) return 0;
int len = s.length();
int left = 0, right = 0;
int max_sub_len = 0;
vector<int> vq(128, 0);
while (right < len) {
if (vq[s[right]]) {
vq[s[left++]] = 0;
continue;
}
++vq[s[right++]];
max_sub_len = max(max_sub_len, right - left);
}
return max_sub_len;
}
};