题目
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
我的思路
- 使用索引
i
,从字符串s
的第二个字符开始向后遍历到最后一个字符; - 使用索引
j
,从索引i
对应字符的前一个字符开始向前遍历到字符串s
的第startidx
个字符,并且在这个过程中判断s[i]
和s[j]
是否相等。如果相等,说明出现重复的字符,取retval
与i - j
(此次循环中 Longest substring without repeating characters 的长度)中较大的值赋给retval
。如果不等,继续向前遍历知道到达第startidx
个字符为止。 - 如果这次循环结束都没有出现重复的字符,那么计算出此时索引
i
与j
两个字符间的长度:i - startidx + 1
,并把此长度与retval
进行比较,取较大值赋给retval
。 - 重复步骤1-3直到
len - startidx <= retval
,即当前retval
的值已经比剩下的字符串总长度要大时,就没有必要再继续下去了。 - 当输入是一个字符时,循环结束后
retval
应该等于 0,此时把字符串s
的总长度赋给retval
即可。
下图是上述思路和下面代码的一个可视化介绍。
代码
int lengthOfLongestSubstring(char* s) {
int startidx = 0;
int len = 0;
int i = 0, j = 0;
int retval = 0;
// length of s
while(*(s + len) != '\0') {
len++;
}
for(i = 1; i < len; i++) {
for(j = i - 1; j >= startidx; j--) {
if(*(s + i) == *(s + j)) {
startidx = j + 1;
if(retval < i - j) {
retval = i - j;
}
break;
}
else {
if(j == startidx) {
if(retval < i - startidx + 1) {
retval = i - startidx + 1;
}
}
}
}
/* Break the loop when the length of remaind items isn't larger than
* retval.
*/
if(len - startidx <= retval) {
break;
}
}
// There is no repeating characters in s.
if(retval == 0) {
retval = len;
}
return retval;
}