🚩传送门:牛客题目

题目

给你一个字符串 [LC]1100. 长度为 K 的无重复字符子串 - 图1,找出所有长度为 [LC]1100. 长度为 K 的无重复字符子串 - 图2不含重复字符的子串,请你返回全部满足要求的子串的 数目

示例 1:

输入:S = “havefunonleetcode”, K = 5 输出:6 解释: 这里有 6 个满足题意的子串,分别是:’havef’,’avefu’,’vefun’,’efuno’,’etcod’,’tcode’。

解题思路:集合判重

利用 set 进行判重,如果 set 中元素个数等于 [LC]1100. 长度为 K 的无重复字符子串 - 图3 说明没有重复元素

我的代码

  1. class Solution {
  2. public int numKLenSubstrNoRepeats(String s, int k) {
  3. HashSet<Character> set = new HashSet<>();
  4. int n=s.length();
  5. int res=0;
  6. for (int i = 0; i <= n-k; i++) {
  7. for (int j = 0; j < k; j++) {
  8. set.add(s.charAt(i+j));
  9. }
  10. // 说明无重复
  11. if(set.size()==k) res++;
  12. set.clear();
  13. }
  14. return res;
  15. }
  16. }

解题思路:滑动窗口

利用 [LC]1100. 长度为 K 的无重复字符子串 - 图4 进行判重,当遇到冲突的时候,[LC]1100. 长度为 K 的无重复字符子串 - 图5清除掉 [LC]1100. 长度为 K 的无重复字符子串 - 图6区域,滑动窗口,从 [LC]1100. 长度为 K 的无重复字符子串 - 图7 处开始继续向下遍历,直至满足大小 [LC]1100. 长度为 K 的无重复字符子串 - 图8
image.png

我的代码

  1. import java.util.HashMap;
  2. class Solution {
  3. public int numKLenSubstrNoRepeats(String s, int k) {
  4. HashMap<Character, Integer> map = new HashMap<>();
  5. int n = s.length();
  6. int res = 0;
  7. for (int i = 0; i < n; i++) {
  8. // 如果发生冲突
  9. if (map.containsKey(s.charAt(i))) {
  10. int back = map.get(s.charAt(i)) + 1;
  11. // 清除窗口[f,b]区域
  12. for (int j = i - map.size(); j < back; j++) {
  13. map.remove(s.charAt(j));
  14. }
  15. // 添加i
  16. map.put(s.charAt(i), i);
  17. } else {
  18. // 未冲突记录i
  19. map.put(s.charAt(i), i);
  20. }
  21. if (map.size() == k) {
  22. res++;
  23. // 清除K窗口起点的map
  24. map.remove(s.charAt(i - k + 1));
  25. }
  26. }
  27. return res;
  28. }
  29. }