初看此题是要找子串,那一般使用滑动窗口,问题在于如何记录已经出现的和判断当前字符是否跟前面的重复了,以及重复了后怎么处理。
- 对于问题一,如何记录,我们可以采用数组的方式记录。
- 对于问题二,如何判断该字符是否出现过,只要判断当前字符是否在问题一中记录过即可,由于问题三中,当我们判断了该字符出现过时,那滑动窗口的左边界应该为出现过的位置的后一个位置,所以问题一中数组记录的最好是字符出现的位置。
int lengthOfLongestSubstring(char * s){
int locationInfo[200];
for (int i = 0; i < 200; ++i) { //字符出现的位置初始化为-1
locationInfo[i] = -1;
}
int strLen = strlen(s);
if (strLen <= 1) {
return strLen;
}
int left = 0;
int right = 0;
int length = 0;
int maxLength = 0;
while (right < strLen) {
if (locationInfo[s[right]] != -1) { // 如果出现过了,那么下个子串左边界应该是之前出现位置的下一个位置,且之前出现位置之前的字符应该置为未出现过
for (int i = left; i < locationInfo[s[right]]; ++i) {
locationInfo[s[i]] = -1;
}
left = locationInfo[s[right]] + 1;
length = right - left + 1;
} else {
length++;
}
locationInfo[s[right]] = right;
right++;
maxLength = maxLength > length ? maxLength : length;
}
return maxLength;
}