码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Leetcode 76. 最小覆盖子串


    在这里插入图片描述

    心路历程:

    这道题一开始以为要用动态规划来解,但是结合题目中需要返回的是最短子串本身而不是长度,因此在对于字符串s建模时至少需要维护i和j两个变量,再加上这道题没有明显的递推。

    这道题是滑动窗口双指针经典问题。
    a. fast指针的更新规则:向右移动直到窗口包含了所有t中的元素。
    b. slow指针更新规则:向右移动直到窗口内元素’刚好‘满足t中元素。
    c. slow驱动下一次fast更新的规则:slow指针’多‘移动一位,使得当前元素又不满足fast停下的规则了,同时让fast加1。
    重复上述三个步骤直到fast或者slow都到头。

    双指针的核心还是在于在while循环中确定双指针的更新规律。

    注意的点:

    1、这道题的难点在于边界条件,需要让fast指针停在刚好满足条件的地方,然后再用slow驱动fast
    2、需要明确fast移动的条件(不满足元素要求)和slow移动的条件(满足元素要求删除冗余)

    解法:双指针+滑动窗口+哈希表

    class Solution:
        def minWindow(self, s: str, t: str) -> str:
            # 这道题动态规划不好做,因为1、题目返回的是一个字符串而不是长度 2、t字符串本质是集合,难以转化为hashable的表达形式
            # 双指针 滑动窗口
            # 注意滑动窗口需要 滑动才行,不是静止窗口
            from collections import Counter
            n = len(s)
            fast, slow = 0, 0
            target = Counter(t)
            redunt = {eve:0 for eve in target.keys()}
            target_len = len(t)
    
            ans = [0, n+1]
            while fast < n and slow < n:
                # print(fast, slow, redunt, target_len, target)
                if target_len != 0:  # 扩张
                    if s[fast] in t:
                        if target[s[fast]] != 0:
                            target[s[fast]] -= 1
                            target_len -= 1
                        else:
                            redunt[s[fast]] += 1
                    if target_len != 0:
                        fast += 1  # 否则让fast停在当前位置
                else:  # 收缩
                    if s[slow] in t:
                        if redunt[s[slow]] != 0:
                            redunt[s[slow]] -= 1
                        else:  # 此时找到了一个结果
                            target[s[slow]] += 1
                            target_len += 1
                            # print(target_len)
                            if fast - slow + 1 < ans[1] - ans[0]:  # 记录结果
                                ans = [slow, fast+1]
                            fast += 1  # 防止fast重复记录,驱动fast指针+1
                    slow += 1  # 找到结果时slow依然+1使得原fast维护的结果不再满足题意
    
            if ans[1] == n + 1:
                return ''
            else:
                return s[ans[0]: ans[1]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    小程序源码:新款最火表情包壁纸独立后台美化二开版本新增加喝酒神器功能
    聚糖-聚乙二醇-CY5.5,Cy5.5-PEG-Chitosan,近红外染料修饰海藻酸钠/壳聚糖Cs
    ICPC 2022网络赛(1) - D Find the Number(暴搜预处理)
    distinct 和 group by有什么区别
    文件系统类数据读取与保存HBase_大数据培训
    代码随想录 Day38 完全背包问题 LeetCode T70 爬楼梯 T322 零钱兑换 T279 完全平方数
    深入了解Spring Boot Actuator
    ​企业该如何做好源代码防泄密工作
    毛玻璃 has 选择器卡片悬停效果
    jQuery、vue、小程序、uni-app中的本地存储数据和接受数据是什么?
  • 原文地址:https://blog.csdn.net/weixin_43483381/article/details/138168810
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号