import java.util.*; public class Solution { public int numKLenSubstrRepeats (String str, int k) { // 记录合格子串数量 int count = 0; // 记录滑动窗口中各种字符的数量 Map<Character,Integer> map = new HashMap<>(); // 滑动窗口默认在字符串首 for (int i = 0; i < k; i++) { char c = str.charAt(i); map.put(c ,map.getOrDefault(c,0)+1); } // 检查初始窗口 if (hasRepeat(map)) count++; // 逐步滑动窗口至末尾,实时更新相关数据 for (int i = k; i < str.length(); i++) { // 更新窗口中的数据,添尾去头 char tail = str.charAt(i); char head = str.charAt(i-k); map.put(tail, map.getOrDefault(tail,0)+1); // 添尾 map.put(head, map.get(head)-1); // 去头 // 数据更新完成后再次检查 if (hasRepeat(map)) count++; } // 窗口滑动至字符串尾,返回统计结果 return count; } // 检查滑动窗口种是否有重复字符 public static boolean hasRepeat(Map<Character,Integer> map) { for (int count : map.values()) { if (count > 1) return true; } // 所有值均小于等于1 return false; } }