package com.interview.string; /** * References * https://leetcode.com/problems/minimum-window-substring/ * http://www.geeksforgeeks.org/find-the-smallest-window-in-a-string-containing-all-characters-of-another-string/ */ import java.util.HashMap; import java.util.Map; public class SmallestWindowContaingAllCharacters { public String minWindow(String s, String t) { Map<Character, Integer> countMap = new HashMap<>(); for (char ch : t.toCharArray()) { Integer val = countMap.get(ch); if (val == null) { val = 0; } countMap.put(ch, val + 1); } int start = 0; int currLen = t.length(); int minWindow = Integer.MAX_VALUE; int minStart = 0; int i = 0; while (i < s.length()) { Integer val = countMap.get(s.charAt(i)); if (val == null) { i++; continue; } if (val > 0) { currLen--; } val--; countMap.put(s.charAt(i), val); while (currLen == 0) { if (minWindow > i - start + 1) { minWindow = i - start + 1; minStart = start; } Integer val1 = countMap.get(s.charAt(start)); if (val1 != null) { if (val1 == 0) { break; } else { val1++; countMap.put(s.charAt(start), val1); } } start++; } i++; } return minWindow != Integer.MAX_VALUE ? s.substring(minStart, minStart + minWindow) : ""; } public static void main(String args[]) { String str = "Tsuaosyogrlmnsluuorjkoruost"; String subString = "soor"; SmallestWindowContaingAllCharacters swcac = new SmallestWindowContaingAllCharacters(); String result = swcac.minWindow(str, subString); System.out.println(result); } }