Leetcode76. Minimum Window Substring

这题挺难的,对着答案才写了出来。
看来双指针还是没那么容易的。
要归纳一下双指针都有哪些走法。

class Solution {
    public String minWindow(String s, String t) {
        if(s.length()==0||t.length()==0) return "";
        
        //Tmap存储目标字符串各字符数目
        Map<Character,Integer> Tmap = new HashMap<>();
        for(int i=0;i<t.length();i++){
            int count = Tmap.getOrDefault(t.charAt(i),0);
            Tmap.put(t.charAt(i),count+1);
        }
        
        //目标字符串字符类数以及目前slidewindow中的字符类数,用于判断是否达到目标
        int CharNumRequired = Tmap.size();
        int CharNumCurrent = 0;
        
        //左右指针,右先走,找到符合要求的slidewindow,左指针再走,找到最小的slidewindow
        int left = 0,right = 0;
        //目前最佳(window_length,left,right)
        int[] ans = {-1,0,0};
        
        //目前slidewindow中字符以及对应数目
        Map<Character,Integer> windowCounts = new HashMap<>();
        
        while(right<s.length()){
            char cur = s.charAt(right);
            int count = windowCounts.getOrDefault(cur,0);
            windowCounts.put(cur,count+1);
            
            if(Tmap.containsKey(cur)&&windowCounts.get(cur).intValue()==Tmap.get(cur).intValue())
                CharNumCurrent++;

            while(CharNumCurrent==CharNumRequired&&left<=right){
                char cur2 = s.charAt(left);
                if(ans[0]==-1||right-left+1<ans[0]){
                    ans[0]=right-left+1;ans[1]=left;ans[2]=right;
                }
                windowCounts.put(cur2,windowCounts.get(cur2)-1);
                if(Tmap.containsKey(cur2)&&windowCounts.get(cur2).intValue()<Tmap.get(cur2).intValue())
                    CharNumCurrent--;
                left++;
            }
            right++;
        }
        return ans[0]==-1?"":s.substring(ans[1],ans[2]+1);
    }
}

Runtime: 23 ms, faster than 46.48% of Java online submissions for Minimum Window Substring.
Memory Usage: 40 MB, less than 19.44% of Java online submissions for Minimum Window Substring.

posted @ 2019-03-28 15:45  大胖子球花  阅读(64)  评论(0)    收藏  举报