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).
For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC"
.
1 public class Solution { 2 public String minWindow(String S, String T) { 3 int sLen = S.length(); 4 int tLen = T.length(); 5 if(sLen==0 || sLen<tLen) return""; 6 int [] ex = new int[256]; 7 int [] app = new int [256]; 8 for(int i=0;i<tLen;i++){ 9 ex[T.charAt(i)]++; 10 } 11 int min = Integer.MAX_VALUE; 12 int minStart = 0; 13 int winStart = 0; 14 int appNum = 0; 15 for(int winEnd=0;winEnd<sLen;winEnd++){ 16 if(ex[S.charAt(winEnd)]>0){ 17 app[S.charAt(winEnd)]++; 18 if(app[S.charAt(winEnd)]<=ex[S.charAt(winEnd)]){ 19 appNum++; 20 } 21 } 22 if(appNum==tLen){ 23 while(app[S.charAt(winStart)]>ex[S.charAt(winStart)]||ex[S.charAt(winStart)]==0){ 24 app[S.charAt(winStart)]--; 25 winStart++; 26 } 27 if(min>winEnd-winStart+1){ 28 min = winEnd-winStart+1; 29 minStart = winStart; 30 } 31 } 32 } 33 if(min == Integer.MAX_VALUE)return ""; 34 return S.substring(minStart,minStart+min); 35 36 } 37 }
while(ex[S.charAt(winStart)]==0||app[S.charAt(winStart)]>ex[S.charAt(winStart)]){
app[S.charAt(winStart)]--;
winStart++;
}
if(min==Integer.MAX_VALUE) return "";