思路
- 由于是字符串。故可以建立数组哈希表hash[128];
- 从头遍历字符串计算每个无重复子串的长度,顺便更新最长子串长度
- hash[val] = key; key表示val出现的位置
- 对于重复重现的val更新它出现的位置,并更新count
- 看代码注释
代码演示
int lengthOfLongestSubstring(char * s){
// start每个表示子串头的位置
int hash[128] = {0}, i, count = 0, start = 0, max = -0x3f3f3f3f;
for (i = 0; s[i]; i++) {
if (hash[s[i]] > start) { //hash[s[i]] > start表示s[i]出现过了
count = i - start; //计算当前子串长度
max = count > max ? count : max;
start = hash[s[i]]; //更新 新的子串头的位置
}
hash[s[i]] = i + 1; //更新重复字符出现位置
}
count = i - start; //计算最后不重复子串长度
return count > max ? count : max;
}