0003.无重复字符的最长子串

无重复字符的最长子串

中等难度

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

示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

示例 4:

输入: s = ""
输出: 0

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

通过次数946,119提交次数2,561,286


版本1

int lengthOfLongestSubstring(char* s){
    char* s0 = s;
    char ss;
    char s1[100] = {};
    int len = 0, i = 0, j = 0, s1len = 0;
    while (* s0){
        i = 0;
        ss = * s0;
        while (1){
            if (!s1[i]){
                break;
            }
            if (ss == s1[i]){
                printf("s1:\"%s\"\n", s1);
                s1len = strlen(s1);
                if (len < s1len){
                    len = s1len;
                }
                for (j = 0; i+j+1 < s1len; ++j){
                    s1[j] = s1[i+j+1];
                }
                i = j;
                for (; j < s1len; ++j){
                    s1[j] = 0;
                }
                printf("ss:%c, s1:%s, i:%d, j:%d\n", ss, s1, i, j);
                break;
            }
            ++i;
        }
        s1[i] = ss;
        printf("-- s1:\"%s\"\n", s1);
        ++s0;
    }

    s1len = strlen(s1);
    if (len < s1len){
        len = s1len;
        printf("s1:\"%s\"\n", s1);
    }

    return len;
}

时间:20ms;内存:5.8MB

版本2

int lengthOfLongestSubstring(char* s){
    int begin = 0, end = 0;
    int i = 0;
    int len = 0, len_tmp = 0;
    char ch = s[end];

    while (ch){
        for (i = begin; i < end; ++i){
            if (ch == s[i]){
                len_tmp = end - begin;
                if (len < len_tmp){
                    len = len_tmp;
                }
                printf("%d, %s\n", end-begin, &s[begin]);
                begin = i+1;
                break;
            }
        }
        ch = s[++end];
    }
    len_tmp = end - begin;
    if (len < len_tmp){
        len = len_tmp;
    }

    return len;
}

时间:4ms;内存:5.8MB

完整算法

滑动下标法

#include <stdio.h>
#include <string.h>

int lengthOfLongestSubstring(char*);

int main(int argc, char** argv){
    char * str = "aabaab!bb";
    int len = lengthOfLongestSubstring(str);
    printf("length of longest substring: %d\n", len);

    return 0;
}

int lengthOfLongestSubstring(char* s){
    int begin = 0, end = 0;
    int i = 0;
    int len = 0, len_tmp = 0;
    char ch = s[end];

    while (ch){
        for (i = begin; i < end; ++i){
            if (ch == s[i]){
                len_tmp = end - begin;
                if (len < len_tmp){
                    len = len_tmp;
                }
                printf("%d, %s\n", end-begin, &s[begin]);
                begin = i+1;
                break;
            }
        }
        ch = s[++end];
    }
    len_tmp = end - begin;
    if (len < len_tmp){
        len = len_tmp;
    }

    return len;
}

output:

1, aabaab!bb
2, abaab!bb
2, baab!bb
3, ab!bb
2, !bb
length of longest substring: 3

时间:4ms;内存:5.8MB

posted @ 2021-04-18 12:26  keep-minding  阅读(56)  评论(0)    收藏  举报