子串

最小覆盖子串

困难#76Java时间 O(n+m)空间 O(128),ASCII 演示

题目要做什么

找到 s 中包含 t 全部字符及其重复数量的最短连续子串。没有可行窗口时返回空字符串。

题目示例输入s = "ADOBECODEBANC", t = "ABC"
题目示例输出"BANC"

01 为什么这样做

need 记录还缺多少字符,missing 记录总缺口。右边界扩展到缺口为零后,不断收缩左边界;移出必要字符时重新扩展。

始终成立的条件

missing = 0 表示当前窗口覆盖 t;bestLen 保存已经遇到的最短合法窗口长度。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public String minWindow(String s, String t) {3        if (t.isEmpty()) return "";4        int[] need = new int[128];5        for (char c : t.toCharArray()) need[c]++;6        int left = 0, missing = t.length(), bestStart = 0, bestLen = Integer.MAX_VALUE;7        for (int right = 0; right < s.length(); right++) {8            char c = s.charAt(right);9            if (need[c] > 0) missing--;10            need[c]--;11            while (missing == 0) {12                if (right - left + 1 < bestLen) {13                    bestStart = left; bestLen = right - left + 1;14                }15                char removed = s.charAt(left++);16                need[removed]++;17                if (need[removed] > 0) missing++;18            }19        }20        return bestLen == Integer.MAX_VALUE ? "" : s.substring(bestStart, bestStart + bestLen);21    }22}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索