题目链接
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
解题思路
先确定大思路:
移动右端点直到区间内有重复字符;
再移动左端点直到区间内无重复字符。
也就是说右端点的移动条件是区间内不存在重复字符,移动右端点是为了尽可能扩大区间,找到最大解;
而左端点移动条件是区间内存在重复字符,移动左端点是为了缩小区间,保证区间满足要求。
AC代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map<char,int> cnt;
int n=s.size(),ans=0,count=0;
s='.'+s;
//核心代码
for(int R=1,L=1;R<=n;R++){//控制右端点移动
if(++cnt[s[R]]==1) ++count;//区间内无当前字符,count++
while(count!=R-L+1){//区间内存在重复字符
if(--cnt[s[L]]==0) --count;//区间内无当前字符,count--
L++;//只要区间内有重复字符(即while条件满足),L++,控制左端点移动
}
ans=max(ans,R-L+1);//区间内无重复字符时,刷新答案
}
return ans;
}
};
京公网安备 11010502036488号