import java.util.*;


public class Solution {
    /**
     *
     * @param S string字符串
     * @param T string字符串
     * @return string字符串
     */
    public boolean isOk(Map<Character, Integer> map, Map<Character, Integer> set) {
        for (Character character : set.keySet()) {
            if (map.getOrDefault(character, 0) < set.get(character))return false;
        }
        return true;
    }
    public String minWindow (String S, String T) {
        boolean flag = false;
        // write code here
        int lPoint = 0, rPoint = 0;
        char[] newS = S.toCharArray();
        char[] newT = T.toCharArray();
        String ans = S;
        Map<Character, Integer> map = new HashMap<>();
        Map<Character, Integer> set = new HashMap<>();
        for (char ch : newT) {
            set.put(ch, set.getOrDefault(ch, 0) + 1);
        }
        while (rPoint < S.length()) {
            map.put(newS[rPoint], map.getOrDefault(newS[rPoint], 0) + 1);
            while (isOk(map, set)) {
                flag = true;
                if (ans.length() > (rPoint - lPoint + 1))ans = S.substring(lPoint, rPoint + 1);
                map.put(newS[lPoint], map.get(newS[lPoint]) - 1);
                lPoint++;
            }
            rPoint++;
        }
        if (flag)
            return ans;
        return "";
    }
}