滑动窗口—无重复字符的最长子串
题目理解:
字符串 s:比如 "abcabcbb"
不含重复字符:子串里每个字符只能出现一次
最长子串长度:找满足条件的最长一段
例子:
输入:s = "abcabcbb"
输出:3(答案是 "abc",长度 3)
核心思路:滑动窗口
我们用两个指针表示一个窗口:
左指针left:窗口左边界
右指针right:窗口右边界
窗口内永远没有重复字符
用一个哈希集合/数组记录当前窗口里出现过的字符
流程:
右指针不断向右移动
如果发现当前字符已经在窗口里了 ——> 移动左指针缩小窗口,直到删除重复字符
每次更新最大长度
完整代码实现如下:
#include
#include
#include <unordered_set>
using namespace std;
int lengthOfLongestSubstring(string s) {
unordered_set
int left = 0; // 左指针
int maxLen = 0; // 最长长度
for (int right = 0; right < s.size(); right++) {
// 如果当前字符已经存在,移动左指针,直到删掉重复的
while (charSet.find(s[right]) != charSet.end()) {
charSet.erase(s[left]);
left++;
}
// 把当前字符加入窗口
charSet.insert(s[right]);
// 更新最大长度
maxLen = max(maxLen, right - left + 1);
}
return maxLen;
}
// 测试
int main() {
string s1 = "abcabcbb";
cout << lengthOfLongestSubstring(s1) << endl; // 输出 3
string s2 = "bbbbb";
cout << lengthOfLongestSubstring(s2) << endl; // 输出 1
string s3 = "pwwkew";
cout << lengthOfLongestSubstring(s3) << endl; // 输出 3
return 0;
}
浙公网安备 33010602011771号