public class MinimumWindowSubstring
{
public MinimumWindowSubstring(){}
public String minWindow(String s, String t)
{
if(s.length() == 0 || t.length() == 0)
{return "";}
int start= 0;int end= 0;
int minStart= 0;int minEnd= 0;
int min= Integer.MAX_VALUE;
int matched= 0;boolean found= false;
Map<Character, Integer> s_map= new HashMap<>();
Map<Character, Integer> t_map= getMap(t);
Queue<Integer> queue= new LinkedList<>();
while(end < s.length())
{
char c= s.charAt(end);
if(t_map.containsKey(c))
{
queue.add(end);
addtoMap(s_map, c);
if(s_map.get(c) <= t_map.get(c))
{matched++;}
}
while(matched == t.length())
{
found= true;
start= queue.poll();
if((end-start) < min)
{
minStart= start;
minEnd= end;
min= end-start;
}
removeformMap(s_map, s.charAt(start));
if(!s_map.containsKey(s.charAt(start)) ||
s_map.get(s.charAt(start)) <
t_map.get(s.charAt(start)))
{matched--;}
}
end++;
}
return found ? s.substring(minStart, minEnd+1) : "";
}
private void addtoMap(Map<Character, Integer> map, char c)
{
if(!map.containsKey(c))
{map.put(c, 1);}
else
{
int count= map.get(c);
map.put(c, count+1);
}
}
private void removeformMap(Map<Character, Integer> map, char c)
{
int count= map.get(c);
count--;
if(count == 0)
{map.remove(c);}
else
{map.put(c, count);}
}
private Map<Character, Integer> getMap(String t)
{
Map<Character, Integer> map= new HashMap<>();
for(int i=0;i<t.length();i++)
{addtoMap(map, t.charAt(i));}
return map;
}
}