標籤:
題目:
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".
這題題目中有視窗兩個字,實際上已經給出一定的提示了。解法為雙指標。
一個尾指標先尋找一個0-n的視窗使得在subString(0,n)中包含了所有的字元。
然後頭指標從0開始出發,試圖從頭部縮小該視窗。然後尾指標每擴大一次,就從頭部縮小一次。直至尾指標到達尾部。
具體實現時,利用兩個數組儲存資訊。
base數組儲存字串t中各個字元的資訊,例如對於題設的例子,T[65]值為1(字元A的ASCII碼值為65)
record儲存已經探測到的字元的個數。
注意,Sum這個變數除了在開始尋找第一個視窗時用來計量是否包含所有字元,一旦找到這一視窗,後面的值恒為0。
因此,第一個視窗找到後,end指標每往後移動一格,就嘗試縮小start的位置。
下面給出代碼:
public class Solution2 {/** * @param args */public String minWindow(String s, String t) { int[]base=new int[256]; int[]record=new int[256]; for(int i=0;i<t.length();i++) { base[t.charAt(i)]++; } int sum=t.length(); int start=0; int minStart=0; int minEnd=Integer.MAX_VALUE; for(int i=0;i<s.length();i++){if(base[s.charAt(i)]>0){record[s.charAt(i)]++;if(record[s.charAt(i)]<=base[s.charAt(i)])sum--;}if(sum==0){System.out.println("shrink begins:"+i);while(true){if(base[s.charAt(start)]>0){if(record[s.charAt(start)]>base[s.charAt(start)]){record[s.charAt(start)]--;}elsebreak;}start++;}System.out.println("minStart="+start+" mimEnd="+i);if((minEnd-minStart)>(i-start)){minEnd=i;minStart=start;}}}return s.substring(minStart, minEnd+1); }public static void main(String[] args) {// TODO Auto-generated method stubString a="ADOBECODEBANCQQ";String b="ABC";System.out.println(new Solution2().minWindow(a,b));}}
leetcode minimum window subString