题目是求字符串中无重复字符的最长序列。
思路
滑动窗口:检查窗口内子串是否有重复字符。
当字符串超长时,超时未能通过,此时需要一点点优化,即:
当窗口内不满足条件时,只移动左边界,使得右边界不需要反复更新。
进一步优化
检查窗口是否存在重复子串时有重复计算,如果只检查新字符是否重复就好了(需要在子串移动左边界时删除左边界的map值)。
实现
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.length() < 2) { return s.length(); }
int left = 0, right = 0;
int maxLength = 1;
unordered_set<char> mapping;
while (right < s.length()) {
if ( mapping.find(s[right]) == mapping.end() ) {
mapping.insert(s[right]);
maxLength = max(maxLength, (right - left + 1));
right++;
}
else {
mapping.erase(s[left]);
left++;
}
}
return maxLength;
}
};