美文网首页
python实现leetcode之76. 最小覆盖子串

python实现leetcode之76. 最小覆盖子串

作者: 深圳都这么冷 | 来源:发表于2021-09-11 09:17 被阅读0次

    解题思路

    滑动窗口

    第一步,统计一下t字符串里面每个字符出现的次数
    第二步,滑动end指针,当begin与end之间能够完全包含t时,尽量滑动begin指针,直到再滑动就不能包围为止(最小覆盖)
    第三步,比较当前窗口和之前保留的最小窗口,谁小保留谁
    第四部,保留的最小窗口对应的字符子串就是ans

    76. 最小覆盖子串

    代码

    class Solution:
        def minWindow(self, s: str, t: str) -> str:
            ct = Counter(t)
    
            cs = {}
            begin = end = 0
            result = (begin, end)
            while end < len(s):
                char = s[end]
                if char in ct:
                    cs[char] = cs.get(char, 0) + 1
                    if cover(cs, ct):
                        # 后指针前进
                        while s[begin] not in ct or cs[s[begin]] > ct[s[begin]]:
                            if s[begin] in cs:
                                cs[s[begin]] -= 1
                            begin += 1
                        gap = result[1] - result[0]
                        if gap == 0 or gap > end+1-begin:
                            result = (begin, end+1)
                # 前指针前进
                end += 1
            return s[slice(*result)]
    
    
    def cover(d1, d2):
        """
        d1覆盖d2吗?
        """
        for k, v in d2.items():
            if d1.get(k, 0) < v: return False
        return True
    
    效果图

    相关文章

      网友评论

          本文标题:python实现leetcode之76. 最小覆盖子串

          本文链接:https://www.haomeiwen.com/subject/rkanwltx.html