力扣--最小覆盖子串--双端队列+滑动窗口

news/2024/4/29 11:24:04

滑动窗口思路(双端队列实现):

可以参考一下:力扣hot8---滑动窗口-CSDN博客以及力扣hot9---滑动窗口-CSDN博客。

使用滑动窗口有以下几个步骤:初始化双端队列(将s的前t_len个元素入队,此时检验是否满足最小覆盖子串的条件,如果满足,直接结束),接下来正式进入滑动过程。首先是进入元素(也就是第t_len+1个元素),再进行排出元素(也就是从队列中的第一个元素开始判断是否可以出队列,条件是什么呢?首先将队列中元素的个数实时的记录在g_s数组中,将字符串t中元素的个数记录在tt数组中,如果g_s数组中的每一个元素个数都大于tt中的元素个数,那么就可以出队列。),最后进行判断当下是否为可行解甚至是最优解(也就是答案子串长度最小),如果是当前的最优解,则进行记录。

代码:

C++:

class Solution {
public:bool check(vector<int>& g_s,vector<int>& tt){ //如果能对上,返回truefor(int i=0;i<60;i++){if(tt[i]==0){continue;}else if(tt[i]!=0 && g_s[i]>=tt[i]){continue;}else{return false;}}return true;}string minWindow(string s, string t) {//双端队列deque<char> q;vector<int> g_s(60,0);vector<int> tt(60,0);int res_len=0x3f3f3f3f;int idx=0;int s_Len=s.size();int t_len=t.size();if(t_len>s_Len){return "";}int idx_temp=0;string res;//初始化qfor(int i=0;i<t_len;i++){q.push_back(s[i]);g_s[s[i]-'A']++;tt[t[i]-'A']++;}if(check(g_s,tt)){for(int i=0;i<t_len;i++){res.push_back(s[i]);}return res;}//正式考察for(int i=t_len;i<s_Len;i++){int a_len=q.size();//进队列q.push_back(s[i]);g_s[s[i]-'A']++;a_len++;//出队列while(true){char temp=q.front();g_s[temp-'A']--;if(!check(g_s,tt)){g_s[temp-'A']++;break;}else{q.pop_front();a_len--;idx_temp++;}}//记录答案if(check(g_s,tt) && res_len>a_len){idx=idx_temp;res_len=a_len;}}//创造答案if(res_len==0x3f3f3f3f){return "";}int end=idx+res_len;for(int i=idx;i<end;i++){res.push_back(s[i]);}return res;}
};

病了好几天,怕Python不会写了()

Python:

class Solution:def minWindow(self, s: str, t: str) -> str:def check(g_s:List[int],tt:List[int]) -> bool:for i in range(60):if tt[i]==0:continueelif tt[i]!=0 and g_s[i]>=tt[i]:continueelse:return Falsereturn Trueq=deque()g_s=[0]*60tt=[0]*60res_len=0x3f3f3f3fidx=0s_len=len(s)t_len=len(t)if t_len>s_len:return ""idx_temp=0res=""#初始化qfor i in range(t_len):q.append(s[i])g_s[ord(s[i])-ord('A')]+=1tt[ord(t[i])-ord('A')]+=1if check(g_s,tt):for i in range(t_len):res+=s[i]return res#正式考察for i in range(t_len,s_len):a_len=len(q)#进队列q.append(s[i])g_s[ord(s[i])-ord('A')]+=1a_len+=1#出队列while 1:temp=q[0]g_s[ord(temp)-ord('A')]-=1if check(g_s,tt)==False:g_s[ord(temp)-ord('A')]+=1breakelse:q.popleft()a_len-=1idx_temp+=1#记录答案if check(g_s,tt) and res_len>a_len:idx=idx_tempres_len=a_lenif res_len==0x3f3f3f3f:return ""end=idx+res_lenfor i in range(idx,end):res+=s[i]return res

明天将继续更新二叉树的最近公共祖先+子集~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

海康威视H5无插件方式显示WSS协议的视频的笔记

由于要在麒麟桌面系统的浏览器也能显示视频&#xff0c;以前的插件方式就不行了。 一、从官网下载文档和demo 打开官网https://open.hikvision.com/download/5c67f1e2f05948198c909700?type10 下载H5开发文件和demo 二、放入我的vue2的项目中 把demo中的相关文件复制到我…

伊理威科技:抖音商家入驻怎么样

随着短视频平台兴起&#xff0c;抖音已成为商家营销的新阵地。但商家入驻抖音&#xff0c;究竟是机遇还是挑战?让我们一探究竟。 抖音的流量红利不容小觑。据统计&#xff0c;日活跃用户数以亿计&#xff0c;这为商家提供了巨大的潜在客户群。通过精准算法推荐&#xff0c;商品…

vscode中解决驱动编写的时候static int __init chrdev_init()报错的问题

目录 错误出错原因解决方法 错误 在入口函数上&#xff0c;出现 expected a ; 这样的提示 出错原因 缺少了 __KERNEL __ 宏定义 解决方法 补上__KERNEL__宏定义 具体做法&#xff1a;在vscode中按下ctrlshiftp &#xff0c;输入&#xff1a;C/C:Edit Configurations&#xff0…

【C初阶】文件操作管理

1.使用文件的意义 用于处理大型数据&#xff0c;长久性的存储数据、 2.文件的概念 文件&#xff1a;电脑硬盘上的存储数据的文件 分类 按照内容&#xff1a;程序文件、数据文件 按照形式&#xff1a;文本文件、二进制文件 文件名&#xff1a;文件的唯一标识&#xff0c;一…

web学习笔记(三十三)

目录 1.严格模式 1.1严格模式的概念&#xff1a; 1.2严格模式在语义上更改的地方&#xff1a; 1.3如何开启严格模式 1.4严格模式应用上的变化 2.原型链 1.严格模式 1.1严格模式的概念&#xff1a; 严格模式有点像es5向es6过渡而产生的一种模式&#xff0c;因为es6的语法…

PDF Shaper Professional / Premium:您的全方位PDF转换利器

在数字化时代的浪潮中&#xff0c;PDF格式因其跨平台、易传输的特性&#xff0c;成为我们日常工作与学习中不可或缺的文件格式。然而&#xff0c;PDF文件的编辑与转换却常常成为我们的难题。这时&#xff0c;一款高效、便捷的PDF转换软件就显得尤为重要。而PDF Shaper Professi…