zoukankan      html  css  js  c++  java
  • [LC] 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).

    Example:

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

    Note:

    • If there is no such window in S that covers all characters in T, return the empty string "".
    • If there is such window, you are guaranteed that there will always be only one unique minimum window in S.

    Time: O(N)

    class Solution:
        def minWindow(self, s: str, t: str) -> str:
            res = ''
            my_dict = {}
            for char in t:
                freq = my_dict.get(char, 0)
                my_dict[char] = freq + 1
            count, start, end, min_len = len(my_dict), 0, 0, sys.maxsize
            res_end, res_start = 0, 0
            while end != len(s):
                char = s[end]
                if char in my_dict:
                    my_dict[char] -= 1
                    if my_dict[char] == 0:
                        count -= 1
                end += 1
                
                while count == 0:    
                    start_char = s[start]
                    if start_char in my_dict:
                        my_dict[start_char] += 1
                        if my_dict[start_char] > 0:
                            count += 1            
                
                    if min_len > end - start:
                        min_len = end - start
                        res_end = end
                        res_start = start
                    start += 1
                    
            return s[res_start: res_end]
                
    class Solution {
        public String minWindow(String s, String t) {
            Map<Character, Integer> map = new HashMap<>();
            int minLen = Integer.MAX_VALUE;
            char[] tCharArray = t.toCharArray();
            for (char c : tCharArray) {
                map.put(c, map.getOrDefault(c, 0) + 1);
            }
            
            int count = map.size(), start = 0, globStart = 0, i = 0;
            char[] sCharArray = s.toCharArray();
            while (i < sCharArray.length) {
                char cur = sCharArray[i];
                if (map.containsKey(cur)) {
                    map.put(cur, map.get(cur) - 1);
                    if (map.get(cur) == 0) {
                        count -= 1;
                    }
                }
                i += 1;
                while (count == 0) {
                    char sChar = sCharArray[start];
                    if (map.containsKey(sChar)) {
                        map.put(sChar, map.get(sChar) + 1);
                        if (map.get(sChar) > 0) {
                            count += 1;                       
                        }
                    }
                    if (i - start < minLen) {
                        globStart = start;
                        minLen = i - start;
                    }
                    start += 1;
                }
            }
            return minLen == Integer.MAX_VALUE ? "" : s.substring(globStart, globStart + minLen); 
        }
    }
  • 相关阅读:
    Tomcat中的类是怎么被一步步加载的?
    Tomcat中的类是怎么被一步步加载的?
    Tomcat中的类是怎么被一步步加载的?
    redis- info调优入门-《每日五分钟搞定大数据》
    redis- info调优入门-《每日五分钟搞定大数据》
    redis- info调优入门-《每日五分钟搞定大数据》
    Lambda表达式详解
    2012年末工作中遇到的问题总结及感悟
    数据库表扩展字段设计思路
    数据库表扩展字段设计思路
  • 原文地址:https://www.cnblogs.com/xuanlu/p/11660721.html
Copyright © 2011-2022 走看看