滑动窗口,这玩意解决一些字符串匹配的题目是真的挺好用的,虽然本质还是双指针。


思路:

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字符串匹配问题的更多相关文章

  1. [转]TCP滑动窗口详解

    TCP滑动窗口详解  http://lyjdamzwf.blog.163.com/blog/static/75206837201193373226/ TCP滑动窗口(Sliding Window)   ...

  2. 滑动窗口经典题 leetcode 3. 无重复字符的最长子串

    题目 解题思路 题目要求找出给定字符串中不含有重复字符的最长子串的长度.这是一个典型的滑动窗口的题目,可以通过滑动窗口去解答. 滑动窗口 具体操作如下图示:找到一个子串 s[left...right] ...

  3. tcp滑动窗口详解(2)

    http://blog.csdn.net/yujun00/article/details/636495 ARQ与滑动窗口概念  滑动窗口协议,是TCP使用的一种流量控制方法.该协议允许发送方在停止并等 ...

  4. leetcode的Hot100系列--3. 无重复字符的最长子串--滑动窗口

    可以先想下这两个问题: 1.怎样使用滑动窗口? 2.如何快速的解决字符查重问题? 滑动窗口 可以想象一下有两个指针,一个叫begin,一个叫now 这两个指针就指定了当前正在比较无重复的字符串,当再往 ...

  5. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...

  6. LeetCode 第 3 题:无重复字符的最长子串(滑动窗口)

    LeetCode 第 3 题:无重复字符的最长子串 (滑动窗口) 方法:滑动窗口 滑动窗口模板问题:右指针先走,满足了一定条件以后,左指针向前走,直到不满足条件. 特点:左右指针的方向是一致的,并且是 ...

  7. LeetCode#3 - 无重复字符的最长字串(滑动窗口)

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: abcabcbb 输出的结果应该是3,最长的无重复的字串是'abc' 果然无论做什么都要静下心来啊!昨晚上卡了一个多小 ...

  8. [LeetCode]3. 无重复字符的最长子串(滑动窗口)

    题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...

  9. [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 ...

随机推荐

  1. C语言编程 菜鸟练习100题(11-20)

    [练习11]计算 int, float, double 和 char 字节大小 0. 题目: 计算 int, float, double 和 char 字节大小 1. 分析: 使用 sizeof 操作 ...

  2. JVM-运行时数据区之PC寄存器

    1.运行时数据区图 运行时数据区是在类加载完成后所经历的阶段,当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,执行引擎就 ...

  3. Django学习之完成数据库主从复制、读写分离和一主多从情况下的使用办法

    1.首先配置多个数据库,在settings配置文件中配置以下内容: DATABASES = { 'default': { #默认数据库,配置多个mysql数据也是ok的,混用数据库也是ok的 'ENG ...

  4. TensorFlow基础剖析

    TensorFlow基础剖析 一.概述 TensorFlow 是一个使用数据流图 (Dataflow Graph) 表达数值计算的开源软件库.它使 用节点表示抽象的数学计算,并使用 OP 表达计算的逻 ...

  5. gradle 混合编程java、scala、kotlin、groovy

    众所周知,java是基于JVM的开发语言,但能够在JVM上运行的开发语言不仅仅有java,目前还有很热门的kotlin(kotlin不仅仅只能开发Android).scala.groovy等等.目前国 ...

  6. 工作流Activiti框架中的LDAP组件使用详解!实现对工作流目录信息的分布式访问及访问控制

    Activiti集成LDAP简介 企业在LDAP系统中保存了用户和群组信息,Activiti提供了一种解决方案,通过简单的配置就可以让activit连接LDAP 用法 要想在项目中集成LDAP,需要在 ...

  7. 端午总结Vue3中computed和watch的使用

    1使用计算属性 computed 实现按钮是否禁用 我们在有些业务场景的时候,需要将按钮禁用. 这个时候,我们需要使用(disabled)属性来实现. disabled的值是true表示禁用.fals ...

  8. 【逆向实战】ES文件浏览器未授权访问漏洞(CVE-2019-6447)具体分析及利用

    /作者:Kali_MG1937 CSDN博客号:ALDYS4 QQ:3496925334 未经许可,禁止转载/ 漏洞简介 CVE-2019-6447是Android端上的一个知名软件:ES文件浏览器的 ...

  9. 【NX二次开发】获取相邻面UF_MODL_ask_adjac_faces

    获取箭头指示的面的相邻面 源码: 1 extern DllExport void ufsta(char *param, int *returnCode, int rlen) 2 { 3 UF_init ...

  10. centos 7 显示系统执行的进程

    命令:ps -aux ps -aux | more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 1911 ...