3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。3. 无重复字符的最长子串
难度中等
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
错误代码:
//pwwkew过不了
int lengthOfLongestSubstring(char* s){
int flag[27];
memset(flag,-1,27);
int max=1;
int num=1;
int i=1;
flag[s[0]-'a']=0;
while(s[i]!='\0'){
printf("%d\n",flag[ s[i]-'a'] );
if(s[i]!=s[i-1]&&flag[s[i]-'a']==-1){
num++;
}else{
num=1;
}
flag[s[i]-'a']=0;
if(num>max){
max=num;
}
i++;
}
return max;
}
//问题1:memset(flag,-1,27);网上有傻叉说最后一位是数组元素个数,放屁,正确的是
memset(flag,-1,sizeof(flag)),欺负我好长时间没敲过c代码;
问题2:但修改后依然没过,因为数组范围只包括小写字母。所以数组扩大;
问题3:对于dvdf依然有问题,因为只要出现过的符号,后面都认为从最新的开始
最终代码
//采用暴力搜索,依次以某一位作为开始
//但还是太慢,不过居然超过了3分之1的运行时间
int lengthOfLongestSubstring(char* s){
if(strlen(s)==0){
return 0;
}
if(strlen(s)==1){
return 1;
}
int flag[127];
int max=1;
int num;
int i,j=1;
while(s[j]!='\0'){
i=j;
num=1;
memset(flag,-1,sizeof(flag));
flag[s[j-1]]=0;
while(s[i]!='\0'){
if(s[i]!=s[i-1]&&flag[s[i]]==-1){
num++;
}else{
break;
}
flag[s[i]]=0;
if(num>max){
max=num;
}
i++;
}
j++;
}
return max;
}
这里在加上一个有滑动的代码
int lengthOfLongestSubstring(char* s){
if(strlen(s)==0){
return 0;
}
if(strlen(s)==1){
return 1;
}
int flag[127];
int max=1;
int num;
int i,j=1;
while(s[j]!='\0'){
i=j;
num=1;
memset(flag,-1,sizeof(flag));
flag[s[j-1]]=0;
while(s[i]!='\0'){
if(s[i]!=s[i-1]&&flag[s[i]]==-1){
num++;
}else if(flag[s[i]]==-1){//这里加了
j=i;
break;
}else{
break;
}
flag[s[i]]=0;
if(num>max){
max=num;
}
i++;
}
j++;
}
return max;
}