• 76. Minimum Window Substring


    题目来源:https://leetcode.com/problems/minimum-window-substring/

     自我感觉难度/真实难度:              写题时间时长:3hour

     题意:

     分析:

     自己的代码:

    class Solution(object):
        def minWindow(self, s, t):
            """
            :type s: str
            :type t: str
            :rtype: str
            """
            # freq=collections.Counter(t)
            freq=collections.defaultdict(int)
            for ch in t:
                freq[ch]+=1
            miss=len(t)
            i=0
            start=end=0
            
            for j,char in enumerate(s,1):
                
                if freq[char] > 0:
                    miss-=1
                freq[char]-=1
                if miss==0:
                    while freq[s[i]]<0:
                        freq[s[i]]+=1
                        i+=1
                    miss+=1
                    freq[s[i]]+=1
    
                    if end==0 or j-i < end-start:
                        end,start=j,i
                    i+=1
            return s[start:end]

    代码效率/结果:

     优秀代码:

    class Solution(object):
        def minWindow(self, s, t):
            """
            :type s: str
            :type t: str
            :rtype: str
            """
            # freq=collections.Counter(t)
            freq=collections.defaultdict(int)
            for ch in t:
                freq[ch]+=1
            miss=len(t)
            i=0     #记录左边的位置
            start=end=0
            
            for j,char in enumerate(s,1):
                 #j记录右边的位置
                if freq[char] > 0:
                    miss-=1
                freq[char]-=1
                if miss==0:
                    while freq[s[i]]<0:
                        freq[s[i]]+=1
                        i+=1
                    miss+=1
                    freq[s[i]]+=1
    
                    if end==0 or j-i < end-start:
                        end,start=j,i
                    i+=1
            return s[start:end]
      def minWindow(self, s, t):
            """
            :type s: str
            :type t: str
            :rtype: str
            """
            if not s or not t:
                return ""
            
            # Defaultdict is very useful in this problem, though i don't like to import modules
            target_count_dict = collections.defaultdict(int)
            for ch in t:
                target_count_dict[ch] += 1
            remain_missing = len(t)
            start_pos, end_pos = 0, float('inf')
            current_start = 0
            
            # Enumerate function makes current_end indexes from 1
            for current_end, ch in enumerate(s, 1):
                # Whenever we encounter a character, no matter ch in target or not, we minus 1 in count dictionary
                # But, only when ch is in target, we minus the length of remain_missing
                # When the remain_missing is 0, we find a potential solution.
                if target_count_dict[ch] > 0:
                    remain_missing -= 1
                target_count_dict[ch] -= 1
                
                if remain_missing == 0:
                    # Remove redundant character
                    # Try to find the fist position in s that makes target_count_dict value equals 0
                    # Which means we can't skip this character in s when returning answer
                    while target_count_dict[s[current_start]] < 0:
                        target_count_dict[s[current_start]] += 1
                        current_start += 1
                    if current_end - current_start < end_pos - start_pos:
                        start_pos, end_pos = current_start, current_end
                    
                    # We need to add 1 to current_start, and the correspondence value in dictionary, is because
                    # this is the first character of the potential answer. So, in future iteration, when we encounter this character,
                    # We can remove this currently first character to try to find a shorter answer.
                    
              target_count_dict[s[current_start]] += 1 remain_missing += 1 current_start += 1 return s[start_pos:end_pos] if end_pos != float('inf') else ""

    代码效率/结果:

     自己优化后的代码:

     反思改进策略:

    1.对比较难的题目,学会从下面三个角度思考

    2.这里使用的是双索引技术,注意思考如何更新左右边界的情况

  • 相关阅读:
    【bzoj2724】[Violet 6]蒲公英 分块+STL-vector
    【bzoj4026】dC Loves Number Theory 可持久化线段树
    【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
    【bzoj3166】[Heoi2013]Alo 可持久化Trie树+STL-set
    【bzoj3060】[Poi2012]Tour de Byteotia 并查集
    【bzoj3510】首都 LCT维护子树信息(+启发式合并)
    【bzoj4530】[Bjoi2014]大融合 LCT维护子树信息
    【bzoj3261】最大异或和 可持久化Trie树
    【bzoj2081】[Poi2010]Beads Hash
    【bzoj4260】Codechef REBXOR Trie树
  • 原文地址:https://www.cnblogs.com/captain-dl/p/10841293.html
Copyright © 2020-2023  润新知