原题:3. 无重复字符的最长子串 - 力扣(LeetCode)
对于一段字符串,若想找到字符互补不重复的最长字串,返回子串的长度,可以使用滑动窗口的思想:
int lengthOfLongestSubstring(char* s) {
int n = strlen(s);
int count = 0;
int index[128] = {0}; // 用于存储每个字符上一次出现的位置
int start = 0;
strlen取出字符串长度,定义、初始化start;
数组index[128]以ASCII码值范围为大小,索引为ASCII中的字符。比如index['a']即index[97];
for (int i = 0; i < n; i++) {
start = fmax(start, index[s[i]]);
count = fmax(count, i - start + 1);
index[s[i]] = i + 1;
}
index[s[i]]=i+1,储存s[i]在该次循环中位置的后一位。当遇到新字符,index[s[i]]=0;当遇到重复字符时,index[s[i]]=i+1(上次的位置是i,+1对应其后面一位,即从没有重复字符开始),而窗口起始位start在该s[i]的前面,即start<index[s[i]],fmax取最值,前面的部分不要,从重复的字符开始重新展开窗口。
count存储子串最大长度,i-start+1是目前的长度。
return count;
}
返回最大长度。