难度中等27收藏分享切换为英文接收动态反馈
给你一个字符串 S
,找出所有长度为 K
且不含重复字符的子串,请你返回全部满足要求的子串的 数目。
示例 1:
输入:S = "havefunonleetcode", K = 5 输出:6 解释: 这里有 6 个满足题意的子串,分别是:'havef','avefu','vefun','efuno','etcod','tcode'。
示例 2:
输入:S = "home", K = 5 输出:0 解释: 注意:K 可能会大于 S 的长度。在这种情况下,就无法找到任何长度为 K 的子串。
提示:
1 <= S.length <= 10^4
S
中的所有字符均为小写英文字母1 <= K <= 10^4
-------------------------------分割线---------------------------------
思路,滑动窗口,结合桶统计。
两个退出内循环的条件:
1. 快指针向右移动式,如果桶中元素已经为1,表明还没到k个字符串,就已经遇到重复字符,此时可以跳出内循环,直接慢指针++。
2.内循环中快慢指针间隔字符数真的能达到5个时,即符合题意的字符串,此时个数加1,并退出内层循环,慢指针++。
int numKLenSubstrNoRepeats(char * s, int k){
int retcnt = 0 ;
int subcnt = 0 ;
int slen = strlen(s);
int cnum[26] = {0};
char *p = s;
char *q = NULL;
if(slen<k)
return 0;
//滑动窗口
while((*p)!='\0'){
subcnt=0;
q = p;
memset(cnum, 0 , sizeof(cnum));
while((*q)!='\0'){
//检测到还没到k个字符串,就已经有重复,直接退出循环,并慢节点++
//printf("%d %d %d\n",(*q), 'a', (*q)-'a');
if(cnum[(*q)-'a']>=1)
break;
cnum[(*q)-'a']++;
subcnt++;
//检测到k个没有相同字符的字符串,子串个数加1
if(subcnt==k){
retcnt++;
break;
}
q++;
}
p++;
}
return retcnt;
}