无重复字符的最长子串
题目链接
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; } };