--刷题记录--滑动窗口


用于自己刷题记录
转载自:https://blog.csdn.net/Dby_freedom/article/details/89066140

滑动窗口

滑动窗口是在一个小于原字符串或数组上进行操作,不在整个字符串和数组上操作,可以将一些嵌套循环变成一个单循环,减少时间复杂度。
一般用在数组和字符串中。

大体框架

滑动:窗口是移动的
窗口:窗口的大小可以是固定的,也可以不是固定,可以缩小也可扩容
思路:

  1. 字符串S中设置双指针,left = right =0,把[left, right]当成一个窗口
  2. 不断增加right指针,扩大窗口,直到窗口中字符串符合要求(包含另一个字符串的全部字符)—寻找可行解
  3. 此时不增加right,增加左指针,缩小窗口,如果同时满足要求,窗口大小小于最小的窗口,则更新左右区间,直到不满足要求—优化可行解
  4. 重复2和3,直到right到达字符串S的尽头

可行技巧

包含子串:由于一般的题目字符的限定范围一般就是26或者整个字符表128,所以设置一个定长数组,用来记录每个字符出现的次数,增加右边界,出现满足题意的情况即可,在满足的情况下更新答案并且缩小左边界,直到右边界走完整个字符串。
外加循环:一般的滑动窗口只要判断右节点是否小于给定数组的长度即可,但是对于数组里是字符串的题目,可以考虑在外面加一层大小为数组元素长度的循环。

算法实例

寻找最靠左子串

题目描述:寻找一个字符串中包含另一个子串的,最靠左的子串左右位置

代码示例:

#include <iostream>
#include <string>
#include <vector>
#include <cstring>

using namespace std;

int bcnt[10],acnt[10];//分别记录B,A中的每个字符出现的个数
string A,B;
const int INF = 0x3f3f3f3f;//定义一个无穷大值

bool check() //满足条件的check函数
{
    for(int i = 0;i < 10;i++){
        if(acnt[i] < bcnt[i]) return false;//A的子串中的每个字符出现的次数都大于等于B
    }
    return true;
}

void solve(){

    cin >> A >> B;
    
    memset(bcnt,0,sizeof(bcnt));//初始化的定义非常重要
    memset(acnt,0,sizeof(acnt));//初始化的定义
    
    for(auto& i : B) bcnt[i -'0']++; //记录B中每个字符出现的次数

    int minlen = INF, left = -1, right = -1;//定义返回值,一开始默认为-1,-1返回值
    int l = 0,r = 0;//[l,r),起始左右位置全为0
    
    while(r < A.length())
    {
        //先处理A的子串还不包含B串所有字符的情况
        //右端点需要右移, r对应的数据值得数量++
        acnt[A[r++] - '0']++;

        //check成立,A的子串包含B的所有字符左端点右移
        while(check()){
            
            if(r - l < minlen){//如果此时成立的最小范围长度小于目前的最小范围长度,就更新结果
                minlen = r-l;
                left = l,right = r-1;
            }
           
            acnt[A[l++] - '0']--; //如果成立就尝试更新结果,把左端点往右移动
        }       
    }

    printf("%d %d\n",left,right);
}

int main()
{
    int T;
    cin >> T;
    while(T--) solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
08-10
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值