🚩传送门:牛客题目
题目
给你一个字符串 ,找出所有长度为
且不含重复字符的子串,请你返回全部满足要求的子串的 数目。
示例 1:
输入:S = “havefunonleetcode”, K = 5 输出:6 解释: 这里有 6 个满足题意的子串,分别是:’havef’,’avefu’,’vefun’,’efuno’,’etcod’,’tcode’。
解题思路:集合判重
利用 set 进行判重,如果 set 中元素个数等于 说明没有重复元素
我的代码
class Solution {public int numKLenSubstrNoRepeats(String s, int k) {HashSet<Character> set = new HashSet<>();int n=s.length();int res=0;for (int i = 0; i <= n-k; i++) {for (int j = 0; j < k; j++) {set.add(s.charAt(i+j));}// 说明无重复if(set.size()==k) res++;set.clear();}return res;}}
解题思路:滑动窗口
利用 进行判重,当遇到冲突的时候,
清除掉
区域,滑动窗口,从
处开始继续向下遍历,直至满足大小
我的代码
import java.util.HashMap;class Solution {public int numKLenSubstrNoRepeats(String s, int k) {HashMap<Character, Integer> map = new HashMap<>();int n = s.length();int res = 0;for (int i = 0; i < n; i++) {// 如果发生冲突if (map.containsKey(s.charAt(i))) {int back = map.get(s.charAt(i)) + 1;// 清除窗口[f,b]区域for (int j = i - map.size(); j < back; j++) {map.remove(s.charAt(j));}// 添加imap.put(s.charAt(i), i);} else {// 未冲突记录imap.put(s.charAt(i), i);}if (map.size() == k) {res++;// 清除K窗口起点的mapmap.remove(s.charAt(i - k + 1));}}return res;}}
