难度中等5681收藏分享切换为英文接收动态反馈
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 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
由英文字母、数字、符号和空格组成
---------------------------------思路------------------------------
统计字符出现次数,可以用桶排序的一部分,256个桶来装就好了,结合双指针方法。慢指针先指向数组头,然后快指针从下标0开始,每经过一个字母,就放到对应桶。放进去之后如果发现桶里面有2个相同字母,就认为遇到重复串,比较得出当前最大非重复串长度。然后慢指针挪一位,重复刚刚的动作,直到慢指针遍历完。
int lengthOfLongestSubstring(char * s){
int flag[256];
int i,j;
int len = strlen(s);
int sum = 0;//当次遇到重复字符停止时,非重复的字符总数
int max = 0;
char *p;
for(i=0;i<len;i++){
p = s+i;
memset(flag, 0, sizeof(flag));
sum = 0;
for(j=0;j<=len-i-1;j++){
flag[p[j]] += 1;
sum +=1;
if(flag[p[j]] >= 2)
{
if(sum>1){
sum -= 1;
}
max = (max < sum)?sum:max;
break;
}
max = (max < sum)?sum:max;
}
}
return max;
}
20210713 第二次刷,速度比之前快乐,算法有一点改良
int lengthOfLongestSubstring(char * s){
char *slow;
char *fast;
int tong[256];
int max=0;
slow = s;
while((*slow)!='\0'){
fast = slow;
memset(tong,0,sizeof(tong));
while(1){
if((*fast)=='\0')
{
max = (max<(fast-slow))?(fast-slow):max;
break;
}
//printf("tong[%c]:%d \n",*fast,tong[*fast]);
if(tong[*fast]>=1){
max = (max<(fast-slow))?(fast-slow):max;
//printf("slow %c fast %c max:%d \n",*slow,*fast,max);
break;
}
tong[*fast]++;
fast++;
}
slow++;
}
return max;
}
附上大神labuladong的滑动窗口图解