从字符串的第一个字符开始扫描,并用string x,x变量保存子串,当扫描到s[i]时,若s[i]不在子串x中,就把它加入子串,如果s[i]已经存在于x中,就更新子串。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty())return 0;
int cnt=0,maxx=1,q=0;//q为下一次子串开始的位置
string xxx="";//用来存储子串
for(int i=0;i<s.length();i++){
char x=s[i];//逐个扫描字符
if((xxx.find(x)>=0)&&(xxx.find(x)<s.length())){//如果当前字符已经在前面的子串当中
int mp=xxx.find(x)+q;//先求出在子串中重复的字符在原字符串的位置
q=mp+1;//记录下下一次子串开始的位置,为重复字符位置的下一个
//q=mp+1;
xxx=s.substr(q,i-mp);//更新的子串为重复字符的下一个位置的字符到s[i]
if(cnt>maxx){
maxx=cnt;//更新最长子串的长度
}
cnt=i-mp;//cnt记录现在子串的长度
}else{//如果不在字串中,就加入
xxx+=x;
cnt+=1;
}
}
if(cnt>maxx)maxx=cnt;//一开始我忘记这个了,导致"au"这个样例没有过
return maxx;
}
};