题目链接

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;
    }
};