题目
题面
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
关键词
最长子串、滑动窗口
思路
需要维护一个区间,保证该区间内没有重复字符。
首先从左边界L_border开始,右边界R_border依次向右移动,直到出现重复字符为止;
然后,左边界L_border向右移动一次,仍满足 [L_border,R_border] 仍满足无重复字符,然后右边界R_border再依次往右移动,直到出现重复字符为止。
统计最大长度即可。
这里用到unordered_set来实现无重复字符判断。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> uset;
int n = s.size();
int rborder = 0;
int ans = 0;
//i为左边界
for(int i=0;i<n;i++){
//将上一个窗口的左边界从set中去除,以便统计新的窗口
if(i!=0){
uset.erase(s[i-1]);
}
while(rborder<n&&uset.find(s[rborder])==uset.end()){
uset.insert(s[rborder]);
//右边界右移
rborder+=1;
}
ans = max(ans,rborder-i);
}
return ans;
}
};
总结
1、滑动窗口思想
滑动窗口的思想之前一直遇到,但没有理解,希望这次加深理解!
而且我认为这种算法思想应该通过大量做题去理解,所以需要继续努力!
滑动窗口是通过两个指针来维护一个窗口区间,主要分成两种:固定大小窗口,动态大小窗口。
应用场景:
- 一般给出的数据结构是数组或者字符串
- 求取某个子串或者子序列最长最短等最值问题或者求某个目标值时
- 该问题本身可以通过暴力求解