給定一個字符串欠母,找出不含有重復字符的最長子串的長度。
示例:
1.給定 "abcabcbb" 哼丈,沒有重復字符的最長子串是 "abc" 边器,那么長度就是3训枢。
2.給定 "bbbbb" ,最長的子串就是 "b" 忘巧,長度是1恒界。
3.給定 "pwwkew" ,最長子串是 "wke" 砚嘴,長度是3十酣。請注意答案必須是一個子串,"pwke" 是 子序列 而不是子串际长。
- 解題思路: 依次讀取字符串的每一個字符耸采,如果第一次出現(xiàn)則當前子串長度+1,否則:首先判斷當前長度是否大于最大長度工育,是則替換最大長度虾宇。然后查找重復的字符是在原字符串哪里出現(xiàn)的。
#include <stdio.h>
#include <string.h>
int lengthOfLongestSubstring(char* s) {
int maxlen = 0,currlen = 0;
int table[128], i, j, start = 0;
memset(table, 0, sizeof(table));
for (i = 0; s[i] != '\0'; ++i){
int num = ++table[s[i]];
if( num == 2 ){
if (currlen > maxlen){
maxlen = currlen;
}
for(j = start; j < i; ++j){
if (s[j] == s[i]){
table[s[j]] = 1;
start = j+1;
break;
}else{
--currlen;
table[s[j]] = 0;
}
}
}else{
++currlen;
}
}
if (currlen > maxlen){
maxlen = currlen;
}
return maxlen;
}
int main() {
// char s[] = "abcdefghiadsdhajdasdsa";
// char s[] = "abcabcabcda";
char s[] = "aaaaaaaa";
int maxlen = lengthOfLongestSubstring(s);
printf("%d",maxlen);
return 0;
}