LeetCode 76. Minimum Window Substring / 567. Permutation in String

news/2024/7/3 2:46:05

76. Minimum Window Substring

典型Sliding Window的问题,维护一个区间,当区间满足要求则进行比较选择较小的字串,重新修改start位置。

思路虽然不难,但是如何判断当前区间是否包含所有t中的字符是一个难点(t中字符有重复)。可以通过一个hashtable,记录每个字符需要的数量,这个数量可以为负(当区间内字符数超过所需的数量)。还需要一个count判断多少字符满足要求了,如果等于t.size(),说明当前窗口的字串包含t里所有的字符了。

class Solution {
public:string minWindow(string s, string t) {unordered_map<char,int> hash; // char and the num it needs (it can be minus)int start=0;string res; int min_len=INT_MAX;for (char ch:t) hash[ch]++;    int count=0;for (int end=0;end<s.size();++end){if (hash.count(s[end])){--hash[s[end]];if (hash[s[end]]>=0) ++count;while (count==t.size()){if (end-start+1<min_len){min_len = end-start+1;res = s.substr(start,end-start+1);}if (hash.count(s[start])){++hash[s[start]];if (hash[s[start]]>0) --count;}++start;}}}return res;}
};

 

567. Permutation in String

和上面一题几乎一模一样,但是全排列的话,不能有其他的字母。这也很好解决,如果count==s1.size(),且字符串长度和s1.size()相等的话,就一定是s1的一个排列。

其实这道题和上一道题,都不用加 hash.count 判断当前字符在不在s1中,因为不在s1中的字符出现后,hash[ch]一定<0;从窗口移除后hash[ch]也不会超过0,因此对count没有影响。

这道题也和 438. Find All Anagrams in a String 很像,由于需要找的字符串长度是固定的,也可以固定长度,滑动窗口来做。

class Solution {
public:bool checkInclusion(string s1, string a) {unordered_map<char,int> hash;for (char ch:s1) ++hash[ch];int count=0;int start=0;for (int end=0;end<a.size();++end){if (hash.count(a[end])){ //this char is in s1--hash[a[end]];if (hash[a[end]]>=0) ++count;while (count==s1.size()){if (end-start+1==s1.size()) return true;if (hash.count(a[start])){++hash[a[start]];if (hash[a[start]]>0) --count;}++start;}}}return false;}
};

 

转载于:https://www.cnblogs.com/hankunyan/p/9603798.html


http://lihuaxi.xjx100.cn/news/236283.html

相关文章

关于互联网技术基层绩效管理的一些思考

起因是一篇内部的文章&#xff0c;那记录也就留在内部吧&#xff0c;磨炼了的价值观在自己心里就好。 类似的还有 1. 罗振宇不发年终奖&#xff1a;https://xueqiu.com/7118120763/119669075 2. 有赞白鸦强行一波996&#xff1a;https://baijiahao.baidu.com/s?id1623959680…

C语言case次数有限制吗,用switch...case语句统计数字、空格和其他字符出现的次数...

//用switch...case语句统计数字、空格和其他字符出现的次数//转自K&R#include int main(void){int c, i, nwhite, nother, ndigit[10];nwhite nother 0;for (i 0; i < 10; i)ndigit[i] 0;while ((c getchar()) ! EOF){switch (c){case 0: case 1: case 2: case 3: …

自己动手,打造轻量级VSCode/C#环境代替LinqPad

.Net 的项目都挺重的&#xff0c;一直想找一个轻量级的 CSharp 环境&#xff0c;能像Python那样&#xff0c;选一个文件就能跑的。之前用的是 LinqPad&#xff0c;但它的缺点也很明显&#xff1a; &#xff08;1&#xff09; 不付费&#xff0c;自动完成不能用&#xff08;…

c语言基础知识pdf下载,C语言主基础知识.pdf

C语言主基础知识泰山学院CSDN 俱乐部C 语言主要基础内容1、预处理命令 预处理的概念&#xff1a;在编译之前进行的处理。预处理命令以符号“#”开头。2 、关于#include 在编译之前将 stdio.h 文件包含入源文件中(include&#xff1a;包含) 即将stdio.h 文件中的内容复制到代码中…

vue - check-versions.js for child_process

webpack之类的配置文件. webpack.base.conf.js

PoPo数据可视化第9期

PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域&#xff0c;发现可视化领域有意思的内容。不想错过可视化领域的精彩内容, 就快快关注吧 :)2018 in the Ito Design Lab&#xff08;视频内容请关注微信公众号浏览&#xff09;1900~2018年城市温度异常变化可视化Temperatur…

在c语言中temp的意思,temp

3.新建一个文本文档&#xff0c;在里面写入两行指令&#xff1a;RD %TEMP% /S/QMKDIR %TEMP%然后另外储存为*.bat格式(比如CleanTEMP.bat)&#xff0c;这样只要打开一下CleanTEMP.bat档案就自动清空Temp资料夹下的杂碎了。4.经过以上三步&#xff0c;我们其实可以很好的清除那些…

layoutSubviews 调用情况

init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时&#xff0c;当rect的值不为CGRectZero时,也会触发addSubview会触发layoutSubviews设置view的Frame会触发layoutSubviews&#xff0c;当然前提是frame的值设置前后发生了变化滚动一个UIScrollView会触发la…