给定一个字符串 S 和一个字符串 T,找到 S 中的最小窗口,它将包含复杂度为 O(n) 的 T 中的所有字符。
示例:
S = "ADOBECODEBANC"
T = "ABC"
最小窗口是 "BANC".
注意事项:
如果 S 中没有覆盖 T 中所有字符的窗口,则返回空字符串 ""。
如果有多个这样的窗口,你将会被保证在 S 中总是只有一个唯一的最小窗口。
详见:https://leetcode.com/problems/minimum-window-substring/description/
Java实现:
class Solution { public String minWindow(String s, String t) { if (s == null || t == null || s.length() < t.length()){ return ""; } // HashMap的key为t中各个字符,value为对应字符个数 Map<Character, Integer> map = new HashMap<Character, Integer>(); for (char c : t.toCharArray()) { if (!map.containsKey(c)){ map.put(c, 0); } map.put(c, map.get(c) + 1); } // minLeft为最小窗口左下标,minLen为最小长度,count用来计数 int minLeft = 0, minLen = s.length() + 1, count = 0; int left = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (map.containsKey(c)) { // 如果map.get(c)说明t中还有字符没有包含,计数器+1 if (map.get(c) > 0){ count++; } map.put(c, map.get(c) - 1); } // 如果left到i中包含t中所有字符 while (count == t.length()) { if (i - left + 1 < minLen) { minLeft = left; minLen = i - left + 1; } c = s.charAt(left); if (map.containsKey(c)) { map.put(c, map.get(c) + 1); if (map.get(c) > 0){ count--; } } left++; } } if (minLen > s.length()){ return ""; } return s.substring(minLeft, minLeft + minLen); } }
参考:https://www.nowcoder.com/questionTerminal/c466d480d20c4c7c9d322d12ca7955ac
详见:https://www.cnblogs.com/grandyang/p/4340948.html