import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param t string字符串
     * @return string字符串
     */
    public static String minWindow (String s, String t) {
        // write code here
        int count = t.length();
        Map<Character, Integer> map = new HashMap<>();
        for (char c : t.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        int left = 0;
        int right = 0;
        String result = "";
        int string_len = Integer.MAX_VALUE;
        while (right < s.length()) {
            if (map.containsKey(s.charAt(right))) {
                map.put(s.charAt(right), map.get(s.charAt(right)) - 1);
                if (map.get(s.charAt(right)) >= 0) {
                    count--;
                }
            }
            right++;
            while (count == 0) {
                if (map.containsKey(s.charAt(left))) {
                    map.put(s.charAt(left), map.get(s.charAt(left)) + 1);
                    if (map.get(s.charAt(left)) > 0) {
                        count++;
                        if (right - left < string_len) {
                            string_len = (right - left);
                            result = s.substring(left, left + string_len);
                        }
                    }
                }
                left++;
            }
        }
        return string_len == Integer.MAX_VALUE ? "" : result;
    }
}

本题考察的知识点是滑动窗口和哈希表的应用,所用编程语言是java。

我们可以考虑使用哈希表来统计字符串t的各字符出现频率,然后利用一个计数器来统计目前需要匹配多少个字符。首先定义两个指针left和right,分别赋初值为0,我们滑动right指针遍历s字符串的各个字符,然后判断该字符是否在哈希表中出现过。

如果出现过,则相应键值对应的value值应该要减一,然后判断该键值对应的value值是否大于等于0,

如果是则count-1,表明已经成功匹配了一个字符。当count为0,我们应该停止滑动right指针,而滑动left指针,缩小窗口范围来找到最短的字符串,当map匹配到相应的key值,相应key值对应的value值加一,然后判断value值是否大于0时,如果是,说明此时已经找到了一个相对于right位置最短的字符串来满足题目的条件。然后应该滑动right指针,继续寻找,知道到达s字符串的末尾