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 }
View Code

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 "";

posted @ 2014-02-12 03:58  krunning  阅读(149)  评论(0编辑  收藏  举报