滑动窗口通用解leetcode字符串匹配问题
滑动窗口,这玩意解决一些字符串匹配的题目是真的挺好用的,虽然本质还是双指针。
思路:
1.维护一个窗口,不断的向右边移动
2.满足要求后,移动左边,当不满足时,跳出。
3.重复1,2.得出答案。
下面有两题leetcode题,一道困难一道中等,现在看来还挺简单的,23333
另外STL的unordered_map的count方法,是验证key值是否存在。
同时如果key值不存在,新加的key对应的值默认为零
438. 找到字符串中所有字母异位词
题目说明:
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
unordered_map<char,int> need; //需要查找的字符串保存的次数
unordered_map<char,int> window; //需要维护的窗口。
int left=0,right=0;//左指针和右指针初始化为零
vector<int> res;//保存结果的
for(char c:p) need[c]++; //将需要匹配的字符串存入need中
int match=0; //判断是否满足,即是否包含
while(right<s.size())
{
char tmp1=s[right];
if(need.count(tmp1))
{
window[tmp1]++;
if(window[tmp1]==need[tmp1])
{
match++;
}
}
right++;
while(match==need.size()) //满足条件,left指针不断向右边,前进,直到不满足条件
{
if(right-left==p.size())
{
res.push_back(left);
}
char tmp2=s[left];
if(need.count(tmp2))
{
window[tmp2]--;
if(window[tmp2]<need[tmp2])
{
match--;
}
}
left++;
}
}
return res;
}
};
76. 最小覆盖子串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:
如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char,int> need;
unordered_map<char,int> window;
int start=0,minlen=INT_MAX;
for(char c:t)
{
need[c]++;
}
int left=0,right=0;
int match=0;
while(right<s.size())
{
char tmp=s[right];
if(need.count(tmp))
{
window[tmp]++;
if(window[tmp]==need[tmp])
{
match++;
}
}
right++;
while(match==need.size())
{
if(right-left<minlen)
{
start=left;
minlen=right-left;
}
char w=s[left];
if(need.count(w))
{
window[w]--;
if(window[w]<need[w])
{
match--;
}
}
left++;
}
}
return minlen==INT_MAX?"":s.substr(start,minlen);
}
};
滑动窗口通用解leetcode字符串匹配问题的更多相关文章
- [转]TCP滑动窗口详解
TCP滑动窗口详解 http://lyjdamzwf.blog.163.com/blog/static/75206837201193373226/ TCP滑动窗口(Sliding Window) ...
- 滑动窗口经典题 leetcode 3. 无重复字符的最长子串
题目 解题思路 题目要求找出给定字符串中不含有重复字符的最长子串的长度.这是一个典型的滑动窗口的题目,可以通过滑动窗口去解答. 滑动窗口 具体操作如下图示:找到一个子串 s[left...right] ...
- tcp滑动窗口详解(2)
http://blog.csdn.net/yujun00/article/details/636495 ARQ与滑动窗口概念 滑动窗口协议,是TCP使用的一种流量控制方法.该协议允许发送方在停止并等 ...
- leetcode的Hot100系列--3. 无重复字符的最长子串--滑动窗口
可以先想下这两个问题: 1.怎样使用滑动窗口? 2.如何快速的解决字符查重问题? 滑动窗口 可以想象一下有两个指针,一个叫begin,一个叫now 这两个指针就指定了当前正在比较无重复的字符串,当再往 ...
- 【LeetCode】无重复字符的最长子串【滑动窗口法】
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...
- LeetCode 第 3 题:无重复字符的最长子串(滑动窗口)
LeetCode 第 3 题:无重复字符的最长子串 (滑动窗口) 方法:滑动窗口 滑动窗口模板问题:右指针先走,满足了一定条件以后,左指针向前走,直到不满足条件. 特点:左右指针的方向是一致的,并且是 ...
- LeetCode#3 - 无重复字符的最长字串(滑动窗口)
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: abcabcbb 输出的结果应该是3,最长的无重复的字串是'abc' 果然无论做什么都要静下心来啊!昨晚上卡了一个多小 ...
- [LeetCode]3. 无重复字符的最长子串(滑动窗口)
题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...
- [LeetCode] Sliding Window Maximum 滑动窗口最大值
Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...
随机推荐
- 文字闪烁效果 CSS + HTML
文字闪烁效果 CSS 写在前面 好好学习,天天向上! 效果图 绝美的效果 实现过程 先给没字体添加一些普通的样式,颜色设置为透明 给文字设置一个动画效果,通过text-shadow属性来实现变亮的效果 ...
- 调试备忘录-SWD协议解析
目录--点击可快速直达 目录 写在前面 1 SWD协议简介 2 SWD物理层协议解析 2.1 SWD通信时序分析 2.2 SWD 寄存器简介 2.2.1 DP寄存器 2.2.2 AP寄存器 ...
- Vue的基本使用和模版语法
Vue的基本使用和模版语法 一.Vue概述 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架 vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目 ...
- vue 打包优化
vue 打包优化 路由按需加载 通过vue写的单页应用时,可能会有很多的路由引入.当打包构建的时候,javascript包会变得非常大,影响加载.如果我们能把不同路由对应的组件分割成不同的代码块,然后 ...
- Django(49)drf解析模块源码分析
前言 上一篇分析了请求模块的源码,如下: def initialize_request(self, request, *args, **kwargs): """ Retu ...
- MindSpore静态图语法支持
MindSpore静态图语法支持 概述 在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图. 关于Graph模式和计算图,可参考文档: ...
- Java线程池底层源码分享和相关面试题(持续更新)
线程池各个参数讲解 public ThreadPoolExecutor(int corePoolSize, //线程池核心工作线程数量,比如newFixedThreadPool中可以自定义的线程数量就 ...
- java并发编程JUC第十二篇:AtomicInteger原子整型
AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作.AtomicInteger 作为java.util.concurrent.atomic包的一部分,从Java 1 ...
- [翻译]在GC上加入DPAD
本文90%通过机器翻译,另外10%译者按照自己的理解进行翻译,和原文相比有所删减,可能与原文并不是一一对应,但是意思基本一致. 译者水平有限,如果错漏欢迎批评指正 译者@Bing Translator ...
- 机械革命z2安装ubuntu20
为了性能买了个游戏本机械革命z2,但还是想用上linux,身为程序员习惯了linux的开发环境有点离不开.但是之前尝试安装deepin或者linux都失败了,一是N卡条件下安装过程和安装之后的显示有问 ...