力扣—无重复字符的最长子串
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int cnt=0,ans=0,p=0,q=-1,index;
if( s.length()==0 ) return 0;
map<char,int> M;
while( q != s.length()-1 ){
// s[q+1]可以加入窗口
//q右移 记下窗口大小
if( M.find(s[q+1]) == M.end() ){
q++;
M[ s[q] ] = q;
cnt++;
}
// s[q+1]不能加入窗口
// p右移直到s[q+1]可以加入窗口为止 同时删除map中相应元素
// 更新临时窗口大小和答案
else {
index = p; // map删除的起始位置
p = M[ s[q+1] ]; // p更新到与s[q+1]产生重复的位置
while(index <= p ){ //map里面全删掉
M.erase( s[index] );
index++;
}
p++; //p的下一位不会与s[q+1]产生重复
q++; //q移动到 q+1
M[ s[q] ] = q;
ans = max(ans,cnt);
cnt = q-p+1;
}
}
ans = max(ans,cnt);
return ans;
}
};