标签:
字符串、双指针、Hash
题目:
给你一个由小写字母组成的长度为n的字符串 S ,找出所有长度为 k 且包含重复字符的子串,请你返回全部满足要求的子串的数目。
数据范围: 2≤k≤400 ,5≤n≤900
进阶: 时间复杂度O(n)O(n),空间复杂度O(n)O(n)
示例1
输入:“createfunonyoka”,4
返回值:4
示例2
输入:“yokagames”,3
返回值:1
示例3
输入:“yoka”,4
返回值:0
反思:
这个题目的话,首先我们先要看懂题目是什么意思,只要看懂题目是什么意思,再利用一下双指针的话,就很容易就可以将该题目解出来。
有一个问题就是:例如说
“createfunonyoka”,k ,我们的遍历到最后K个字符(如上就是yoka)就停下来?那就在我们的循环中指定chars.length - k就行了.
具体步骤:
- step 1:将字符串转成字符,定义HashSet、count
- step 2:一层循环遍历每一个字符,每遍历到每一个字符就将该字符放到set里面
- step 3:二层循环遍历 i + 1到 i + k
个字符,判断字符是否在HashSet中,如果存在count++,并且break,如果不存在则add进HashSet里面 - step 4:一层循环结束之后,起立HashSet中的缓存
用到的知识点:
字符串、双指针、Hash
代码:
public class Solution {
public int numKLenSubstrRepeats(String s, int k) {
Set<Character> set = new HashSet<>();
char[] chars = s.toCharArray();
int count = 0;
for (int i = 0; i <= chars.length - k; i++) {
set.add(chars[i]);
for (int j = i + 1; j < i + k; j++) {
if (!set.contains(chars[j])) {
set.add(chars[j]);
continue;
}else{
count++;
break;
}
}
set.clear();
}
return count;
}
}