[leedcode 76] 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".

Note:
If there is no such window in S that covers all characters in T, return the emtpy string "".

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

public class Solution {
    public String minWindow(String s, String t) {
        //本题思路:
        //利用两个数组,以字母为下标,一个记录t中字母出现的总次数,一个记录当前搜索中已经出现字母的次数
        //处理情况:
        //1.遍历s字符串时,如果字符在t中出现,需要累计已经出现的次数,
        //2.维护一个变量count,记录当前出现了多少个合法子字符,多次重复出现的算不合法字符,
        //  如果合法字符等于子字符长度,那么就是找到一个窗口了。
        //3.找到后,需要对start重新定位
        int needTofind[]=new int[256];// 保存T中需要查找字符的个数,该数组一旦初始化完毕就不再改动 
        int hasFound[]=new int[256];// 保存S中已经找到字符的个数,该数组会动态变化 
        int minWindow=Integer.MAX_VALUE;
        String res="";
        for(int i=0;i<t.length();i++){// 初始化needToFind为需要查找字符的个数,
            needTofind[t.charAt(i)]++;
        }
        int start=0;
        int end=0;
        int count=0;
        for(;end<s.length();end++){// 用end来遍历S字符串
            if(needTofind[s.charAt(end)]==0)continue;// 表示可以忽略的字符,即除了T外的所有字符 
            char temp=s.charAt(end);// 找到一个需要找的字符
            hasFound[s.charAt(end)]++;
            if(needTofind[s.charAt(end)]>=hasFound[s.charAt(end)]) count++;// 如果找到的已经超过了需要的,就没必要继续增加count  
            if(count==t.length()){// 该窗口中至少包含了T 
                while(needTofind[s.charAt(start)]==0||needTofind[s.charAt(start)]<hasFound[s.charAt(start)]){
                    // 压缩窗口,往后移start指针,一种情况是start指针指的都是可忽略的字符 
                    if(needTofind[s.charAt(start)]<hasFound[s.charAt(start)]){
                        // 另一种情况是已经找到字符的个数超过了需要找的个数,因此可以舍弃掉多余的部分  
                       hasFound[s.charAt(start)]--;// 舍弃掉多余的部分
                    }
                    start++; // 压缩窗口 
                }
                int window=end-start+1;
                if(window<minWindow){// 保存最小窗口 
                    res=s.substring(start,end+1);
                    minWindow=window;
                    
                }
            }
            
        }
        return res;
    }
}

 

posted @ 2015-07-14 19:10  ~每天进步一点点~  阅读(136)  评论(0编辑  收藏  举报