• 本文讲解力扣76.最小覆盖字串问题
  • 主要用到的是滑动窗口的思想


目录

  • 76.最小覆盖字串
    • 题目:
    • 分析:
    • 步骤描述:
    • 复杂度分析:
    • 结果

76.最小覆盖字串

题目:

给定字符串 S 以及字符串 T ,求 S 种 包含 T 的最短连续子字符串的长度

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。

要求 时间复杂度 ≤ O(n)

分析:

首先,返回的是字符串类型,想到使用 substr函数 截取对应的子串

使用数组,映射 T 中的字符情况,标记字符存在与否、对应的数量

使用滑动窗口的解法,可以解决大部分字符串匹配的问题~

步骤描述:

  • L R 指针。都从最左端到最右端移动,且 L <= R,L 只能在R 左边或者重合
  • 挪动指针,根据映射情况,找到满足要求的窗口
  • 找到一个窗口,继续挪动,不影响结果的情况下寻找其它满足要求的窗口,取最小值
  • 挪动的时候,注意 L 指针会更新,所以会“抛出”窗口原来最左边的字符,需要处理“如果窗口抛出的是T中存在的某个字符”这种情况
class Solution {public:string minWindow(string s, string T) {vector<int> chars(128,0); vector<bool> flag(128,false); // 记录字符是否在 T 中存在// 映射 T 中的字符情况for(int i = 0; i < T.size(); ++i){flag[T[i]] = true;++chars[T[i]]; // 字符的数量}int cnt =0; // 判断 T的字符是不是都找完了int l=0,min_l=0;int min_size=s.size()+1;for (int r = 0; r < s.size(); ++r) {if (flag[s[r]]) {if (--chars[s[r]] >=0) {++cnt;}// 窗口包含了全部字符之后, L 指针继续后移,继续寻找其它满足情况,找最小窗口while (cnt == T.size()) {if (r-l+1 < min_size) {min_l = l;min_size = r-l+1;}// 窗口后挪,左边会“抛出”// 如果抛出的是T中存在的某个字符if (flag[s[l]] && ++chars[s[l]] >0) {--cnt;}++l;}}}return min_size >s.size()?"":s.substr(min_l, min_size);}
};

复杂度分析:

虽然代码使用了 for 和 while嵌套,但是 while 只是用来滑动的,所以时间复杂度是满足要求的 O(n)

结果

双指针算法之滑动窗口 | 力扣76.最小覆盖字串相关推荐

  1. 力扣76,最小覆盖字串(JavaScript)

    通过遍历字符串 t,整理t中出现的字符(key)和次数(value),保存在map中,然后遍历字符串s var minWindow = function(s, t) {let r=l=0let len ...

  2. LeetCode系列76—最小覆盖字串

    题意 76. 最小覆盖子串 题解 方法一:滑动窗口 在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针.在任意时刻,只有一个指针运动,而另一 ...

  3. 力扣- - 最短回文串(KMP算法)

    力扣- - 最短回文串(KMP算法) 文章目录 力扣- - 最短回文串(KMP算法) 一.题目描述 二.分析之KMP算法 1.暴力法 2.KMP算法 3.next数组求法1:暴力查找最长的前后缀 4. ...

  4. 美团/力扣(647)--回文字串

    美团/力扣(647)–回文字串 文章目录 美团/力扣(647)--回文字串 一.题目描述 二.分析 方法一:中心扩散 代码一: 方法二:DP 代码二: 一.题目描述 力扣: 美团: 兄弟们!刷题的重要 ...

  5. 简单介绍4种限流算法!(固定窗口计数器算法、滑动窗口计数器算法、漏桶算法、令牌桶算法)...

    作者:架构小菜 链接:https://www.jianshu.com/p/7987bf427b5b 简单介绍 4 种非常好理解并且容易实现的限流算法! 一.固定窗口计数器算法 规定我们单位时间处理的请 ...

  6. 【算法】 - 滑动窗口

    1. 题目链接 2. 分析 最多可以将K个值从0变成1,因此滑动窗口的限制条件: 0的数量(zeros)小于K,算法过程如下 有一个滑动窗口(slipper),每次都会从A中读入一个数 当读入的数为0 ...

  7. java redis 限流_Redis——限流算法之滑动窗口、漏斗限流的原理及java实现

    限流的意义 限流一般是指在一个时间窗口内对某些操作请求的数量进行限制,比如一个论坛限制用户每秒钟只能发一个帖子,每秒钟只能回复5个帖子.限流可以保证系统的稳定,限制恶意请求,防止因为流量暴增导致系统瘫 ...

  8. 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...

  9. 【算法】滑动窗口、713、209

    滑动窗口 1.基本概念 滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口. 分类:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口. 应用:利用滑动窗口获取平滑的数据 ...

最新文章

  1. C# DataTable的詳細使用方法
  2. Android应用程序获得root权限
  3. OpenGL编程指南5:学习绘制不同风格的曲线
  4. HTML禁用Flash文件右键
  5. [PAT乙级]1043 输出PATest
  6. 【编程好习惯】通过命名规则区分变量
  7. NYOJ-独木舟上的旅行(贪心)
  8. JDK 之 HttpClient(jdk11)
  9. javascript设计模式-抽象工厂模式
  10. UVALive - 6436
  11. java ArrayList中的subList方法
  12. Xshell是做什么用的?Xshell使用教程分享
  13. python龙卷风框架,龙卷风python的简单异步示例
  14. 头条小程序模板全行业合集,头条小程序制作平台分享
  15. 从淘宝P5到天猫总监,她的阿里十年发生了什么?
  16. 249PHP等于多少钱,一百万新台币等于多少人民币
  17. VC++深入详解学习笔记
  18. 基于墨刀的软件界面原型设计----视频软件
  19. 如何解决Gridea部分主题不渲染Katex的问题
  20. 【迭代器】迭代器相应型别

热门文章

  1. Linux网络配置与命令
  2. 栈——用顺序表实现栈操作
  3. [web安全]深入理解反射式dll注入技术
  4. 渗透测试中的一波三折
  5. vbs发送邮件(win10环境下成功)
  6. 160个Crackme034拆解KeyFile验证升级版
  7. 1.18 StringBuffer替换特殊字符
  8. 大一写的C课程设计(图书馆管理系统)
  9. Python_sqlalchemy——创建、查询、删除、更新一对多的表
  10. Mysql之复制一张表的内容到新表中