package com.app.main.LeetCode.slidingwindow;
import java.util.HashMap;
import java.util.Map;
/**
*
* 76
*
* hard
*
* https://leetcode.com/problems/minimum-window-substring/
*
* 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).
*
* Example:
*
* Input: S = "ADOBECODEBANC", T = "ABC"
* Output: "BANC"
* Note:
*
* If there is no such window in S that covers all characters in T, return the empty string "".
* If there is such window, you are guaranteed that there will always be only one unique minimum window in S.
*
*
* Created with IDEA
* author:Dingsheng Huang
* Date:2020/1/19
* Time:下午3:55
*/
public class MinimumWindowSubstring {
//"ab"
//"a"
//"ab"
//"b"
//"bba"
//"ab"
public String minWindow(String s, String t) {
if (t.length() == 0 || s.length() == 0 || s.length() < t.length()) {
return "";
}
Map<Character, Integer> count = new HashMap<>();
Map<Character, Integer> tCount = new HashMap<>();
for (int i = 0; i < t.length(); i++) {
if (tCount.containsKey(t.charAt(i))) {
tCount.put(t.charAt(i), 1 + tCount.get(t.charAt(i)));
} else {
tCount.put(t.charAt(i), 1);
}
}
int min = s.length();
int start = 0;
int end = s.length() - 1;
int l = 0;
int cn = t.length();
for (int r = 0; r < s.length(); r++) {
if (cn == 0) {
if (count.containsKey(s.charAt(r))) {
count.put(s.charAt(r), 1 + count.get(s.charAt(r)));
}
while (!count.containsKey(s.charAt(l)) || (count.containsKey(s.charAt(l)) && count.get(s.charAt(l)) > tCount.get(s.charAt(l)))) {
if (count.containsKey(s.charAt(l))) {
count.put(s.charAt(l), count.get(s.charAt(l)) - 1);
}
l++;
}
if (r - l + 1 < min) {
min = r - l + 1;
start = l;
end = r;
}
} else {
if (tCount.containsKey(s.charAt(r))) {
if (count.containsKey(s.charAt(r))) {
if (count.get(s.charAt(r)) < tCount.get(s.charAt(r))) {
cn--;
count.put(s.charAt(r), 1 + count.get(s.charAt(r)));
} else {
count.put(s.charAt(r), 1 + count.get(s.charAt(r)));
}
} else {
count.put(s.charAt(r), 1);
cn--;
}
}
if (cn == 0 && r == s.length() - 1) {
while (!count.containsKey(s.charAt(l)) || (count.containsKey(s.charAt(l)) && count.get(s.charAt(l)) > tCount.get(s.charAt(l)))) {
if (count.containsKey(s.charAt(l))) {
count.put(s.charAt(l), count.get(s.charAt(l)) - 1);
}
l++;
}
if (r - l + 1 < min) {
min = r - l + 1;
start = l;
end = r;
}
}
}
}
if (cn > 0) {
return "";
}
// update count
Map<Character, Integer> count2 = new HashMap<>();
for (int i = start; i <= end; i++) {
if (count2.containsKey(s.charAt(i))) {
count2.put(s.charAt(i), 1 + count2.get(s.charAt(i)));
} else {
count2.put(s.charAt(i), 1);
}
}
//"ab"
//"a"
while (!tCount.containsKey(s.charAt(end)) || (count2.containsKey(s.charAt(end)) && (count2.get(s.charAt(end)) > tCount.get(s.charAt(end))))) {
if (tCount.containsKey(s.charAt(end))) {
count2.put(s.charAt(end), count2.get(s.charAt(end)) - 1);
}
end--;
}
return s.substring(start, end + 1);
}
//"ask_not_what_your_country_can_do_for_you_ask_what_you_can_do_for_your_country"
//"ask_country"
//Output
//"sk_not_what_your_co"
//Expected
//"sk_not_what_your_c"
}
LeetCode--76--hard--MinimumWindowSubstring
猜你喜欢
转载自blog.csdn.net/huangdingsheng/article/details/104306079
今日推荐
周排行