1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| package algorithm;
import java.util.HashMap; import java.util.Map;
public class MinimumWindowSubstring {
static Map<Character, Integer> ori = new HashMap<>(); static Map<Character, Integer> cnt = new HashMap<>();
public static String minWindow(String s, String t) { int tLen = t.length(); for (int i = 0; i < tLen; i++) { char c = t.charAt(i); ori.put(c, ori.getOrDefault(c, 0) + 1); } int l = 0, r = -1; int len = Integer.MAX_VALUE, ansL = -1, ansR = -1; int sLen = s.length(); while (r < sLen) { ++r; if (r < sLen && ori.containsKey(s.charAt(r))) { cnt.put(s.charAt(r), cnt.getOrDefault(s.charAt(r), 0) + 1); } while (check() && l <= r) { if (r - l + 1 < len) { len = r - l + 1; ansL = l; ansR = l + len; } if (ori.containsKey(s.charAt(l))) { cnt.put(s.charAt(l), cnt.getOrDefault(s.charAt(l), 0) - 1); } ++l; } } return ansL == -1 ? "" : s.substring(ansL, ansR); }
public static boolean check() { for (Map.Entry<Character, Integer> entry : ori.entrySet()) { Character key = entry.getKey(); Integer val = entry.getValue(); if (cnt.getOrDefault(key, 0) < val) { return false; } } return true; }
public static void main(String[] args) { // System.out.println(minWindow("ADOBECODEBANC", "ABC"));
System.out.println(minWindow("a", "a")); } }
|