Leetcode 76 Minimum Window Substring. (最小窗口子字符串) (滑动窗口, 双指针)


** Leetcode 76 **

问题描述

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).

例子

Example:
Input: S = "ADOBECODEBANC", T = "ABC"
Output: "BANC"

解决方案

** Solution Java Method one **
** 3ms, beats 92.14% **
** 39.8MB, beats 46.81% **
class Solution {
    public String minWindow(String s, String t) {
        if (s == null || s.length() == 0 || s.length() < t.length()) 
            return "";
        char[] sArray = s.toCharArray();
        char[] tArray = t.toCharArray();
        int[] map = new int[256];
        for (int i = 0; i < tArray.length; ++i) 
            ++map[tArray[i]];

        int minStart = 0, start = 0;
        int count = tArray.length;
        int minLength = Integer.MAX_VALUE;
        
        for (int end = 0; end < sArray.length; ++end) {
            if (map[sArray[end]] > 0)
                --count;
            --map[sArray[end]];
            while (count == 0) {
                if (end - start + 1 < minLength) {
                    minStart = start;
                    minLength = end - start + 1;
                }
                ++map[sArray[start]];
                if (map[sArray[start]] > 0)
                    ++count;
                ++start;
            }
        }
        if (minStart + minLength > sArray.length) 
            return "";
        return s.substring(minStart, minStart + minLength);
    }
}
** Solution Java Method Two **
** 12ms, 68.18% **
** 39.8MB, 46.81% **
class Solution {
    public String minWindow(String s, String t) {
        if (s == null || s.length() == 0 || s.length() < t.length()) 
            return "";
        Map<Character, Integer> map = new HashMap<>();
        char[] tArray = t.toCharArray();
        char[] sArray = s.toCharArray();
        for(char chr : tArray)
            map.put(chr, map.getOrDefault(chr, 0) + 1);
        
        int count = tArray.length;
        int minStart = 0, minLength = Integer.MAX_VALUE;
        int start = 0;
        
        for(int end = 0; end < sArray.length; ++end){
            char chr = sArray[end];
            if (map.containsKey(chr)) {
                map.put(chr, map.get(chr) - 1);
                if (0 <= map.get(chr))
                    --count;
            }
            while (count == 0){
                if (end - start + 1 < minLength) {
                    minStart = start;
                    minLength = end - start + 1;
                }
                if (map.containsKey(sArray[start])) {
                    map.put(sArray[start], map.get(sArray[start]) + 1);
                    if (map.get(sArray[start]) > 0)
                        ++count;
                }
                ++start;
            }
        }
        if (minStart + minLength > sArray.length) 
            return "";
        return s.substring(minStart, minStart + minLength);
    }
}
** Solution Python3 **
** 96ms, beats 86.89% **
** 13.3MB, beats 61.11% **
class Solution:
    def minWindow(self, s, t):
        need, missing = collections.Counter(t), len(t)
        i = I = J = 0
        for j, c in enumerate(s, 1):
            missing -= need[c] > 0
            need[c] -= 1
            if not missing:
                while need[s[i]] < 0: need[s[i]] += 1; i += 1
                if not J or j - i <= J - I: I, J = i, j
                need[s[i]] += 1; i += 1; missing += 1      
        return s[I : J]
posted @ 2020-02-08 12:55  willwuss  阅读(152)  评论(0编辑  收藏  举报