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字符串的末尾