class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.size();
if(n<2)
return n;
bool ct[128]={0};
int l=0,r=0,temp;
int ans=0;
char repeat;
while(l<=r&&r<n)
{
while(ct[s[r]]==0) //向右扩展找到最后一个不重复的元素
{
if(r==n)
{
if((temp=r-1-l+1)>ans)
{
ans=temp;
}
return ans;
}
else
{
ct[s[r]]=1;
++r;
}
}
repeat=s[r]; //记录重复元素
if((temp=r-1-l+1)>ans)
{
ans=temp;
}
while(s[l]!=repeat) //找到造成重复元素的字符,滑动窗口左指针向右移动
{
ct[s[l]]=0;
++l;
}
++l; //删除该字符,此时s[r]==s[l],该元素是存在的。从逻辑上讲不能像上面循环里一样ct[s[l]]=0
//(ct[s[l]]也可以置0,此时底下++r的操作需要删去,但是从逻辑上讲不通)
++r; //左侧已经确保不重复,此时再向右扩展一位,否则和原来相比没有变化,答案不会更新(贪心)
//并且可能因为l比r大,且重复的元素ct值没有更新,造成滑动窗口不前进而提前退出整个循环
//比如"aab","aaaaa"
}
return ans;
}
};