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

news2024/11/23 13:10:37

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

可以参考一下:力扣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){ //如果能对上,返回true
        for(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;
        //初始化q
        for(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:
                    continue
                elif tt[i]!=0 and g_s[i]>=tt[i]:
                    continue
                else:
                    return False
            return True
        q=deque()
        g_s=[0]*60
        tt=[0]*60
        res_len=0x3f3f3f3f
        idx=0
        s_len=len(s)
        t_len=len(t)
        if t_len>s_len:
            return ""
        idx_temp=0
        res=""
        #初始化q
        for i in range(t_len):
            q.append(s[i])
            g_s[ord(s[i])-ord('A')]+=1
            tt[ord(t[i])-ord('A')]+=1
        if 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')]+=1
            a_len+=1
            #出队列
            while 1:
                temp=q[0]
                g_s[ord(temp)-ord('A')]-=1
                if check(g_s,tt)==False:
                    g_s[ord(temp)-ord('A')]+=1
                    break
                else:
                    q.popleft()
                    a_len-=1
                    idx_temp+=1
            
            #记录答案
            if check(g_s,tt) and res_len>a_len:
                idx=idx_temp
                res_len=a_len
        if res_len==0x3f3f3f3f:
            return ""
        end=idx+res_len
        for i in range(idx,end):
            res+=s[i]
        return res

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

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

相关文章

竞赛 - 基于机器视觉的图像拼接算法

前言 图像拼接在实际的应用场景很广&#xff0c;比如无人机航拍&#xff0c;遥感图像等等&#xff0c;图像拼接是进一步做图像理解基础步骤&#xff0c;拼接效果的好坏直接影响接下来的工作&#xff0c;所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧&#xff0c;…

算法·动态规划Dynamic Programming

很多人听到动态规划或者什么dp数组了&#xff0c;或者是做到一道关于动态规划的题目时&#xff0c;就会有一种他很难且不好解决的恐惧心理&#xff0c;但是如果我们从基础的题目开始深入挖掘动规思想&#xff0c;在后边遇到动态规划的难题时就迎难而解了。  其实不然&#xff…

数据库关系运算理论:关系数据操作与关系完整性概念解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

王者荣耀使用的UDP通信,十几年编程没用过的协议

缘起 最近在查阅moba相关的资料时&#xff0c;看到了一篇王者荣耀的研发同学的技术分享&#xff0c;从文章中了解到王者荣耀的通信方式是UDP通信&#xff0c;回想到整个职业生涯&#xff0c;貌似并没有用过&#xff0c;今天特地整理下。 udp技术细节 udp协议 UDP协议叫做用…

PTA——1075 链表元素分类、1105 链表合并、1110 区块反转

1075 链表元素分类 解决代码 #include<bits/stdc.h> using namespace std; struct node{int v;int next; }; map<int,node> s; vector<vector<pair<int,int>>> ans(3); vector<pair<int,int>> w; int main(){int st,n,k;cin>>…

web容器导论

一、基础概念 1.Web容器是什么&#xff1f; 让我们先来简单回顾一下Web技术的发展历史&#xff0c;可以帮助你理解Web容器的由来。 早期的Web应用主要用于浏览新闻等静态页面&#xff0c;HTTP服务器&#xff08;比如Apache、Nginx&#xff09;向浏览器返回静态HTML&#xff…

【A-003】基于SSH的校园报刊亭进销存管理系统(含论文)

【A-003】基于SSH的校园报刊亭进销存管理系统&#xff08;含论文&#xff09; 开发环境&#xff1a; Eclipse/MyEclipse、Tomcat8、Jdk1.8 数据库&#xff1a; MySQL 适用于&#xff1a; 课程设计&#xff0c;毕业设计&#xff0c;学习等等 系统介绍 功能需求 系统架构图…

TCP协议 及 重要机制

目录 1.TCP 协议报文格式 1.1.端口号 1.2 首部长度 和 选项 1.3 保留位 1.4 检验和 1.5 32位序号和确认序号 2. TCP的重要机制 2.1 确认应答 2.2 超时重传 2.3 连接管理 2.3.1 三次握手 2.3.2 四次挥手 2.4 滑动窗口 2.5 流量控制 2.6 拥塞控制 2.7 延时应答 2…

投简历没回复?9位DBA公众号集结,快上车!

&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; 中国DBA联盟(ACD…

蓝桥杯之简单数论冲刺

文章目录 取模快速幂 取模 这道题目有两个注意点&#xff1a; 1.当你的取模之后刚好等于0的话&#xff0c;后面就不用进行后面的计算 2.if sum detail[i] > q: 这个语句的等号也很重要 import os import sys# 请在此输入您的代码a,b,n map(int,input().split())week a*5 …

slab分配器

什么是slab分配器&#xff1f; 用户态程序可以使用malloc及其在C标准库中的相关函数申请内存&#xff1b;内核也需要经常分配内存&#xff0c;但无法使用标准库函数&#xff1b;linux内核中&#xff0c;伙伴分配器是一种页分配器&#xff0c;是以页为单位的&#xff0c;但这个…

全网良心开源知识库:AI学习者的宝藏之地

导语&#xff1a;在这个信息爆炸的时代&#xff0c;想要入门AI&#xff0c;找到最一流的学习资源并非易事。然而&#xff0c;有一个地方&#xff0c;能让你免费学习AI&#xff0c;获取最顶尖的知识&#xff0c;还能加入最优秀的AI学习圈。今天&#xff0c;我要向大家推荐的&…

05.自定义指令,插槽和路由配置

一、学习目标 1.自定义指令 基本语法&#xff08;全局、局部注册&#xff09;指令的值v-loading的指令封装 2.插槽 默认插槽具名插槽作用域插槽 3.综合案例&#xff1a;商品列表 MyTag组件封装MyTable组件封装 4.路由入门 单页应用程序路由VueRouter的基本使用 一、自…

大数据 - Spark系列《十四》- spark集群部署模式

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《…

C语言例3-35:长度运算的例子

长度运算符的表现形式&#xff1a; sizeof(数据类型符&#xff09; 或 sizeof(变量&#xff09; 长度运算符的优先级&#xff1a; 与单目算术运算符、单目逻辑运算符、自增和自减运算符的优先级相同。上述优先级相同的运算符的结合性都是从右至左。 长度运算的例子 代码如…

【漏洞复现】Progress Kemp LoadMaster 命令注入漏洞(CVE-2024-1212)

0x01 产品简介 Progress Kemp LoadMaster是一款高性能的应用交付控制器&#xff0c;具有可扩展性&#xff0c;支持实体硬件和虚拟机的负载均衡。它提供了当今应用服务所需的各种功能&#xff0c;包括深度用户验证、资安防护&#xff08;如WAF/IPS/DDoS防护&#xff09;以及零信…

如何写出干净的 Git Commit

大家好&#xff0c;我是楷鹏。 写一份干净的 Git Commit&#xff0c;不仅赏心悦目&#xff0c;也有诸多好处&#xff0c;比如 为项目或者仓库生成 change log方便在其他一些 Git 工具使用&#xff0c;比如 CI/CD、代码协作和审计平台、发版工具等 这是 AngularJS 仓库的 Git …

【C++ leetcode】双指针问题(续)

3. 202 .快乐数 题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…

UE5 TPS开发p25 设置大厅,销毁会话,快速退出,检查按钮

这节课主要是完善了菜单选择地图作为游戏大厅,MultiPlayerSessionSubsystem的销毁会话函数,然后就是给Menu菜单添加了Quit和禁止使用按钮 同时还完善了创建房间的漏洞,因为在创建房间的时候如果退出后就马上加入就会发现自己无法创建房间,这是因为服务器判断房间销毁是有一定延…

英伟达 V100、A100/800、H100/800 GPU 对比

近期&#xff0c;不论是国外的 ChatGPT&#xff0c;还是国内诸多的大模型&#xff0c;让 AIGC 的市场一片爆火。而在 AIGC 的种种智能表现背后&#xff0c;均来自于堪称天文数字的算力支持。以 ChatGPT 为例&#xff0c;据微软高管透露&#xff0c;为 ChatGPT 提供算力支持的 A…