👨🏫 题目地址
🍻 AC code
class Solution {public String minWindow(String s, String t){int n = s.length();int m = t.length();if (n < m)return "";char[] tt = t.toCharArray();int[] cnt = new int[128];// 字符计数数组for (int i = 0; i < m; i++)cnt[tt[i]]++;// 统计t串的字符int l = 0, r = 0;int left = 0, right = 0, ans = Integer.MAX_VALUE;while (r < n){System.out.println(m);char c = s.charAt(r++);if (cnt[c] > 0)// 在 t串 中出现过的字符才减,减到 0 即止m--;cnt[c]--;// 当前子串 抵消 t串 的字符统计while (m == 0)// 当前子串完全覆盖完 t 串{if (r - l < ans)// 更新答案{ans = r - l;left = l;right = r;}c = s.charAt(l++);// 子串左边界右移// cnt[c] == 0 : 字符c是 t 串的。如果不是t串的,cnt[c] 为负值if (cnt[c] == 0)m++;cnt[c]++;// 取消对当前字符的统计}}if (ans == Integer.MAX_VALUE)return "";elsereturn s.substring(left, right);}
}
👨🏫 参考题解