[leetcode]76. Minimum Window Substring@Java解题报告

来源:互联网 发布:新网域名证书查询 编辑:程序博客网 时间:2024/05/20 19:45

https://leetcode.com/problems/minimum-window-substring/#/description


Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

For example,
S = "ADOBECODEBANC"
T = "ABC"

Minimum window is "BANC".

Note:
If there is no such window in S that covers all characters in T, return the empty string "".

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.


package go.jacob.day725;import java.util.HashMap;import java.util.Map;/** * 76. Minimum Window Substring *  * @author Jacob * */public class Demo2 {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中还有字符没有包含,计数器+1if (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);}}