这道题可以用哈希表+滑动窗口来解
思路:首先记录初始窗口为前两个字符,并用哈希表记录。当字符串中没有哈希表中记录的字符时,右窗口扩大,继续比较,当哈希表中已经有了当前字符时,左窗口缩小,并且把左窗口的字符在哈希表中的记录清零,这里要注意,先清零后缩小窗口。每次在右窗口扩大时,比较并记录当前最大子串长度,直到右窗口到达字符串结尾比较完成,返回最大子串长度。
int lengthOfLongestSubstring(char* s) {
int* b = (int*)malloc(sizeof(int) * 26);//创建数组作哈希表
for (int i = 0; i < 26; i++) {
b[i] = 0;
}
char* quick = (s + 1);//初始右窗口
char* slow = s;//初始左窗口
b[*slow - 'a'] = 1;
int maxlength = 0;//当前最大子串长度
int now = 0;//当前子串长度
while (*quick != '\0') {
if (b[*quick - 'a'] > 0) {//哈希表中已有记录时,先把左窗口在哈希表中的值清零,再缩小窗口
b[*slow - 'a'] = 0;
slow++;
}
else {
b[*quick - 'a'] = 1;//无记录时,扩大窗口并记录比较当前子串与最大子串的长度
now = (quick - slow)+1;
maxlength = fmax(now, maxlength);
quick++;
}
}
free(b);
return maxlength;
}