https://leetcode.cn/problems/minimum-window-substring/
- 欠债表

all是欠款总数量


只要减减后,不小于0,就是有效还款,all也要减减,
若小于0则是无效还款,all不变




第一次all变成0的时刻,记录窗口长度,此时窗口的含义是如果子串必须以0开头,至少多长才能包含所有的字符,
后面的先别管,L开始缩
以1开头,记录窗口长度,然后L继续缩
欠款了, 让R往右继续
。。。
。。
。。
补充:coding细节, 窗口设置成左闭右开的,初始值就很容易设置, [0, 0) 就表示这个窗口一开始没数
public static String minWindow(String s, String t) {if (s.length() < t.length()) {return "";}char[] sStr = s.toCharArray();char[] tStr = t.toCharArray();//欠帐表int[] map = new int[256];//初始化欠帐表for (char c : tStr) {map[c]++;}int all = tStr.length;int len = Integer.MAX_VALUE;//窗口左闭右开,[0, 0)代表一开始还没数int L = 0;int R = 0;int ansL = 0;int ansR = 0;for (R = 0; R < sStr.length; R++) {if (--map[sStr[R]] >= 0) { //有效还款all--;}if (all == 0) { //可以更新答案了while (map[sStr[L]] < 0) { //尽可能收缩map[sStr[L++]]++;}if (len > (R - L + 1)) {len = R - L + 1;ansL = L;ansR = R;}//下一个窗口了, 此刻map[sStr[L]]肯定是>=0的map[sStr[L++]]++;all++;}}return len == Integer.MAX_VALUE ? "" : s.substring(ansL, ansR + 1);}
