双指针算法之滑动窗口 | 力扣76.最小覆盖字串
- 本文讲解力扣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.最小覆盖字串相关推荐
- 力扣76,最小覆盖字串(JavaScript)
通过遍历字符串 t,整理t中出现的字符(key)和次数(value),保存在map中,然后遍历字符串s var minWindow = function(s, t) {let r=l=0let len ...
- LeetCode系列76—最小覆盖字串
题意 76. 最小覆盖子串 题解 方法一:滑动窗口 在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针.在任意时刻,只有一个指针运动,而另一 ...
- 力扣- - 最短回文串(KMP算法)
力扣- - 最短回文串(KMP算法) 文章目录 力扣- - 最短回文串(KMP算法) 一.题目描述 二.分析之KMP算法 1.暴力法 2.KMP算法 3.next数组求法1:暴力查找最长的前后缀 4. ...
- 美团/力扣(647)--回文字串
美团/力扣(647)–回文字串 文章目录 美团/力扣(647)--回文字串 一.题目描述 二.分析 方法一:中心扩散 代码一: 方法二:DP 代码二: 一.题目描述 力扣: 美团: 兄弟们!刷题的重要 ...
- 简单介绍4种限流算法!(固定窗口计数器算法、滑动窗口计数器算法、漏桶算法、令牌桶算法)...
作者:架构小菜 链接:https://www.jianshu.com/p/7987bf427b5b 简单介绍 4 种非常好理解并且容易实现的限流算法! 一.固定窗口计数器算法 规定我们单位时间处理的请 ...
- 【算法】 - 滑动窗口
1. 题目链接 2. 分析 最多可以将K个值从0变成1,因此滑动窗口的限制条件: 0的数量(zeros)小于K,算法过程如下 有一个滑动窗口(slipper),每次都会从A中读入一个数 当读入的数为0 ...
- java redis 限流_Redis——限流算法之滑动窗口、漏斗限流的原理及java实现
限流的意义 限流一般是指在一个时间窗口内对某些操作请求的数量进行限制,比如一个论坛限制用户每秒钟只能发一个帖子,每秒钟只能回复5个帖子.限流可以保证系统的稳定,限制恶意请求,防止因为流量暴增导致系统瘫 ...
- 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II
代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...
- 【算法】滑动窗口、713、209
滑动窗口 1.基本概念 滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口. 分类:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口. 应用:利用滑动窗口获取平滑的数据 ...
最新文章
- C# DataTable的詳細使用方法
- Android应用程序获得root权限
- OpenGL编程指南5:学习绘制不同风格的曲线
- HTML禁用Flash文件右键
- [PAT乙级]1043 输出PATest
- 【编程好习惯】通过命名规则区分变量
- NYOJ-独木舟上的旅行(贪心)
- JDK 之 HttpClient(jdk11)
- javascript设计模式-抽象工厂模式
- UVALive - 6436
- java ArrayList中的subList方法
- Xshell是做什么用的?Xshell使用教程分享
- python龙卷风框架,龙卷风python的简单异步示例
- 头条小程序模板全行业合集,头条小程序制作平台分享
- 从淘宝P5到天猫总监,她的阿里十年发生了什么?
- 249PHP等于多少钱,一百万新台币等于多少人民币
- VC++深入详解学习笔记
- 基于墨刀的软件界面原型设计----视频软件
- 如何解决Gridea部分主题不渲染Katex的问题
- 【迭代器】迭代器相应型别