滑动窗口算法 发表于 2020-09-14 | 分类于 算法 | 次阅读 字数统计: 453 | 阅读时长 ≈ 2分钟 76.最小覆盖子串 12345678910111213141516171819202122232425262728293031/* 滑动窗口算法框架 */ void slidingWindow(String s, String t) { HashMap<Character, Integer> need, window; for (char c : t.toCharArray()) { need.put(c, need.getOrDefault(c, 0) + 1); } int left = 0, right = 0; int valid = 0; while (right < s.length()) { // c 是将移入窗口的字符 char c = s.charAt(right); // 右移窗口 right++; // 进行窗口内数据的一系列更新 ... /*** debug 输出的位置 ***/ System.out.printf("window: [%d, %d)\n", left, right); /********************/ // 判断左侧窗口是否要收缩 while (window needs shrink){ // d 是将移出窗口的字符 char d = s.charAt(left); // 左移窗口 left++; // 进行窗口内数据的一系列更新 ... } } ⏬⏬⏬ 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748public String minWindow(String s, String t) { HashMap<Character, Integer> need = new HashMap<>(); HashMap<Character, Integer> window = new HashMap<>(); for (Character c : t.toCharArray()) { need.put(c, need.getOrDefault(c, 0) + 1); } int left = 0; int right = 0; //满足need条件的字符个数 int vaild = 0; //记录最小覆盖子串的其实索引和长度 int start = 0; int len = Integer.MAX_VALUE; while (right < s.length()) { //c是即将移入窗口的字符 char c = s.charAt(right); //右移窗口 right++; //进行窗口内数据更新 if (need.containsKey(c)) { window.put(c, window.getOrDefault(c, 0) + 1); if (window.get(c).equals(need.get(c))) { vaild++; } } //判断左侧窗口是否需要收缩 while (vaild == need.size()) { //更新最小覆盖子串 if (right - left < len) { start = left; len = right - left; } //d是即将移除的字符 char d = s.charAt(left); //左移窗口 left++; //进行窗口内数据更新 if (need.containsKey(d)) { if (window.get(d).equals(need.get(d))) { vaild--; } window.put(d, window.get(d) - 1); } } } //返回最小覆盖子串 return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len); } 坚持原创技术分享,您的支持将鼓励我继续创作! 打赏 微信支付 本文作者: 李智 发布时间: 2020年09月14日 - 14:09 更新时间: 2021年03月18日 - 14:03 本文链接: http://justdoitlee.github.io/2020/09/14/滑动窗口算法/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!