Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc"
, with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b"
, with the length of 1.
Example 3:
Input: "pwwkew" Output: 3 Explanation: 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.
自己的代码
int lengthOfLongestSubstring(char* s) {
int len = strlen(s);
if (len == 0) {
return 0;
}
int maxl = 0;
int maxr = 0;
int maxLength = 1;
for (int i = 0; i <= len-maxLength; i++) {
maxl = i;
for (int j = maxr+1; j < len; j++) {
maxr = j;
for (int k = i; k < j; k++) {
if (s[j] == s[k]) {
maxr = j-1;
break;
}
}
if (maxr < j) {
break;
}
}
maxLength = maxr - maxl + 1>maxLength ? maxr - maxl + 1 : maxLength;
}
return maxLength;
}
大佬的代码
int lengthOfLongestSubstring(char* s)
{
int len = 0;
char *end = s, *temp;
char* addressTable[128] = { NULL };
while (*end) {
temp = addressTable[*end];
addressTable[*end] = end;
if (temp >= s) {
len = end - s>len ? end - s : len;
s = temp + 1;
}end++;
}
len = end - s>len ? end - s : len;
return len;
}
给跪了。。。。这也太强了吧!!!
总结:
在字符串a1a2a3a4a5...an中,若以a1为开头从前往后找到另一元素ax与a1相等,则以a1为头的遍历结束。接下来开始以a2为头开始遍历,且遍历可以从ax开始。这样只需要遍历一遍就可以完成了。