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 * 104s由英文字母、数字、符号和空格组成
通过次数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

浙公网安备 33010602011771号