1/ 开辟一个空间为256的int型数组dict[],初始值全为-1
2/ 设置一个flag变量,记录字符上一次出现的位置,初始值为-1
3/ 将字符串S[]中的字符和其下标,与新开辟的数组下标和值一一对应。
例如 字符串 s[]="ABCDGAB“
dict[字符]=对应的下标志;
即,
dict[A]=0;
dict[B]=1;
……
dict[s[i]]=i;
4/ 每次建立关系前,先判断该字符是否出现过,用dict[s[i]]>flag=-1判断。
若出现过,用此时的i减去上次的下标值。
以字符A为例,
dict[A]=0; //A第一次出现
dict[A]=5; //A第二次出现
当运行到A第二次出现的位置时,不执行dict[s[i]]=i;
而是将上一次的i取出来,赋值给flag;
i-flag即为无重复子串的长度。
5/ 选出最大的一组长度返回
max(maxLen, i-flag);
当A再次出现,dict[A]=0>flag=-1,start=dict[s[i]];通过i-flag就可得无重复子串长度

// 完整代码如下
int LongestSubstringWithoutDuplication(String s){
vector<int>dict(256,-1);
int flag=-1;
for(int i=0;i<s.length();i++){
if(dict[s[i]]>start) {
start=dict[s[i]];
}
dict[s[i]]=i;
int maxLen=max(maxLen, i-flag);
}
return maxLen;