美文网首页
LeetCode - 3. 无重复字符的最长子串(C语言)

LeetCode - 3. 无重复字符的最长子串(C语言)

作者: 代码守望者 | 来源:发表于2018-07-30 11:21 被阅读855次

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

1.给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

2.给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

3.给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。

  • 解题思路: 依次读取字符串的每一个字符,如果第一次出现则当前子串长度+1,否则:首先判断当前长度是否大于最大长度,是则替换最大长度。然后查找重复的字符是在原字符串哪里出现的。
#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;
}

相关文章

网友评论

      本文标题:LeetCode - 3. 无重复字符的最长子串(C语言)

      本文链接:https://www.haomeiwen.com/subject/vinxvftx.html