Advertisement
1988coder

76. Minimum Window Substring

Nov 11th, 2018
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.33 KB | None | 0 0
  1. /**
  2.  * Sliding Window
  3.  *
  4.  * Time Complexity: O(S + T)
  5.  *
  6.  * Space Commplexity: O(S)
  7.  *
  8.  * S = length of String S. T = length of String T
  9.  */
  10. class Solution {
  11.     public String minWindow(String s, String t) {
  12.         if (s == null || t == null || s.length() == 0 || t.length() == 0 || s.length() < t.length()) {
  13.             return "";
  14.         }
  15.  
  16.         Map<Character, Integer> map = new HashMap();
  17.  
  18.         // Adding all characters in string S in the map with count 0. This will help us
  19.         // to return early if string T contains characters not present in string S.
  20.         for (char c : s.toCharArray()) {
  21.             map.put(c, 0);
  22.         }
  23.  
  24.         // Adding all characters in string T in the map with their count.
  25.         for (char c : t.toCharArray()) {
  26.             if (!map.containsKey(c)) {
  27.                 return "";
  28.             }
  29.             map.put(c, map.get(c) + 1);
  30.         }
  31.  
  32.         int charTLeft = t.length();
  33.         int minLen = Integer.MAX_VALUE;
  34.         int minStart = 0;
  35.         int start = 0;
  36.         int end = 0;
  37.  
  38.         // Sliding Window
  39.         while (end < s.length()) {
  40.             char sEnd = s.charAt(end);
  41.             if (map.get(sEnd) > 0) {
  42.                 charTLeft--;
  43.             }
  44.             map.put(sEnd, map.get(sEnd) - 1);
  45.  
  46.             while (charTLeft == 0) {
  47.                 if (minLen > end - start + 1) {
  48.                     minLen = end - start + 1;
  49.                     minStart = start;
  50.                 }
  51.                 char sStart = s.charAt(start);
  52.                 map.put(sStart, map.get(sStart) + 1);
  53.                 if (map.get(sStart) > 0) {
  54.                     charTLeft++;
  55.                 }
  56.                 start++;
  57.             }
  58.  
  59.             end++;
  60.         }
  61.  
  62.         if (minLen == Integer.MAX_VALUE) {
  63.             return "";
  64.         }
  65.         return s.substring(minStart, minStart + minLen);
  66.     }
  67. }
  68.  
  69. /**
  70.  * Sliding Window. This solution adds an optimization for very long string S
  71.  * when compared to string T. Also string S contains lot of characters not in T.
  72.  *
  73.  * Time Complexity: O(S + T)
  74.  *
  75.  * Space Commplexity: O(S + T)
  76.  *
  77.  * S = length of String S. T = length of String T
  78.  */
  79. import javafx.util.Pair;
  80. class Solution {
  81.     public String minWindow(String s, String t) {
  82.         if (s == null || t == null || s.length() == 0 || t.length() == 0 || s.length() < t.length()) {
  83.             return "";
  84.         }
  85.  
  86.         Map<Character, Integer> map = new HashMap();
  87.         // Adding all characters in string T in the map with their count.
  88.         for (char c : t.toCharArray()) {
  89.             map.put(c, map.getOrDefault(c, 0) + 1);
  90.         }
  91.  
  92.         List<Pair<Integer, Character>> filteredS = new ArrayList();
  93.         // Creating a new list with characters in S that are present in T too.
  94.         for (int i = 0; i < s.length(); i++) {
  95.             char c = s.charAt(i);
  96.             if (map.containsKey(c)) {
  97.                 filteredS.add(new Pair<Integer, Character>(i, c));
  98.             }
  99.         }
  100.  
  101.         int charTLeft = t.length();
  102.         int minLen = Integer.MAX_VALUE;
  103.         int minStart = 0;
  104.         int start = 0;
  105.         int end = 0;
  106.  
  107.         // Sliding Window
  108.         while (end < filteredS.size()) {
  109.             Pair<Integer, Character> endPair = filteredS.get(end);
  110.             int endPairIdx = endPair.getKey();
  111.             char endPairChar = endPair.getValue();
  112.  
  113.             if (map.get(endPairChar) > 0) {
  114.                 charTLeft--;
  115.             }
  116.             map.put(endPairChar, map.get(endPairChar) - 1);
  117.  
  118.             while (charTLeft == 0) {
  119.                 Pair<Integer, Character> startPair = filteredS.get(start);
  120.                 int startPairIdx = startPair.getKey();
  121.                 char startPairChar = startPair.getValue();
  122.  
  123.                 if (minLen > endPairIdx - startPairIdx + 1) {
  124.                     minLen = endPairIdx - startPairIdx + 1;
  125.                     minStart = startPairIdx;
  126.                 }
  127.  
  128.                 map.put(startPairChar, map.get(startPairChar) + 1);
  129.                 if (map.get(startPairChar) > 0) {
  130.                     charTLeft++;
  131.                 }
  132.                 start++;
  133.             }
  134.  
  135.             end++;
  136.         }
  137.  
  138.         if (minLen == Integer.MAX_VALUE) {
  139.             return "";
  140.         }
  141.         return s.substring(minStart, minStart + minLen);
  142.     }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement