使用DP的思想
L[i]记录的是最长无重复字串,L[i]=s[m,..,i],终点到i,我们为s[]中每一个字符构建一个hashmap,关键字为char,值为在原字符串中的下标index
。
下面开始找s[i+1]
如果s[i+1]在hashmap中没有出现,将s[i+1]加入hasp表,并且L[i+1]=s[m,…,i+1],map[s[i+1]]=i+1;
如果s[i+1]出现了,并且s[i+1]在hashmap中的下标为k,那么m需要跟新
m=max[m,k],L[i+1]=s[m,…,i+1],同时hashmap也要同时跟新,即map[s[i+1]]=i+1;
所以要一直更新map
int lengthOfLongestSubstring(string s) {
// for ASCII char sequence, use this as a hashmap
vector<int> charIndex(256, -1);
int longest = 0, m = 0;
for (int i = 0; i < s.length(); i++) {
m = max(charIndex[s[i]] + 1, m); // automatically takes care of -1 case
charIndex[s[i]] = i;
longest = max(longest, i - m + 1);
}
return longest;
}
注意 这里m的值记录的是到i的最长自序列的起始下标