滑动窗口算法(C语言描述)
第一种类型:不固定长窗口
问题1:***
C代码1:
#include<stdio.h>
#include<string.h>
#define N 5int min_len(int len1,int len2)
{return (len1 < len2 ? len1:len2);
}int main()
{int target = 0;int num[N];scanf("%d",&target);for(int i = 0;i < N;i++){scanf("%d",&num[i]);}//滑动窗口算法int left = 0;int right = 0;int sum = 0;int len = N+1;while(right < N){sum += num[right];while(sum >= target){sum -= num[left];if(sum < target){len = min_len(len,right-left+1);}left++;}right++;}if(len == N+1){printf("No such subarray exists!");}else{printf("%d",len);}return 0;
}
问题2:*****
C代码2:
#include<stdio.h>
#include<string.h>
#define N 80//向窗口右边添加一个字符,拓宽窗口
void Add_char(char ch,char *window)
{int right = strlen(window);window[right] = ch;
}
//检查窗口字符串是否满足包含字符串t所有字符且数量不少于t
int Is_ok(char *t,char *window)
{int needs[128]={0};int windows[128]={0};int n=0;int w=0;int len1 = strlen(window);int len2 = strlen(t);for(int i=0;i<len1;i++){w = (int)window[i];windows[w]++;}for(int j=0;j<len2;j++){n = (int)t[j];needs[n]++;}for(int k = 0;k < 128;k++){if(needs[k] != 0 && windows[k] < needs[k]){return 0;//不满足条件}}return 1;//满足条件
}/*判断当前满足条件的窗口字符串和满足条件的上一次结果字符串比较谁更短,并更新结果。
注意这里不要单纯的把指针result指向新结果(也就是窗口),因为窗口会随着循环而改变,
这样无法保留做中的正确结果,应该把结果字符串赋值给指针result指向的空间*/
void minlen(char *result,char *window)
{int result_len = strlen(result);int window_len = strlen(window);if(result_len > window_len){for(int i = 0;i <= window_len;i++){result[i] = window[i];}}
}//移除窗口左边第1个字符
void remove_char(char *window)
{int len = strlen(window);for(int i= 0;i < len;i++){window[i] = window[i+1];}
}int main()
{//定义所需字符数组char s[N];//存储字符串schar t[N];//存储字符串tchar window[N]={'\0'};//窗口内的字符串char *result = s;//存储找到的满足条件的最短字符串,这里初始化时将其指向字符串s//输入字符串s和tscanf("%s",s);scanf("%s",t);//定义滑动窗口所需变量int left = 0;//窗口左边界指针int right = 0;//窗口右边界指针int end = strlen(s);//字符串s的长度,窗口滑动的终止点//开始滑动窗口寻找满足条件的最短字符串int flag = 0;while(right < end){Add_char(s[right],window);//拓宽窗口右边界while(Is_ok(t,window)&&left < end)//窗口满足条件,已包含字符串t所有字符且数量也不少{flag = 1;minlen(result,window);//更新最短满足条件子串答案remove_char(window);//移除窗口左边第1个字符left++;//窗口左边界边界向前滑动}right++;}if(flag){printf("%s\n",result);}else{printf("No such string!\n");}return 0;
}
问题3:
C代码3:
和上面一个题目差不多,只不过在这里更新答案要加点条件。
#include<stdio.h>
#include<string.h>//向窗口右边添加一个字符,拓宽窗口
void add_char(int right,char *s,char *window)
{int len = strlen(window);window[len] = s[right];
}//检查窗口字符串是否满足包含字符串t所有字符且数量不少于t
int Is_ok(char *window,char *p)
{int len_w = strlen(window);int len_p = strlen(p);int windows[128]={0};int ps[128]={0};int t=0;for(int i = 0;i<len_w;i++){t = (int)window[i];windows[t]++;}for(int j = 0;j<len_p;j++){t = (int)p[j];ps[t]++;}for(int k = 0;k<128;k++){if(ps[k] != 0&& ps[k] > windows[k]){return 0;}}return 1;}//移除窗口左边第1个字符
void remove_char(char *window)
{int len_w = strlen(window);for(int i=0;i<len_w;i++){window[i] = window[i+1];}}
int main()
{//定义字符数组char s[20101]={'\0'};char p[20101]={'\0'};char win[20101]={'\0'};//输入字符串s和pscanf("%s",s);scanf("%s",p);//滑动窗口求解答案int left = 0;int right = 0;char *window = win;int end = strlen(s);int flag = 0;//检查s中满足条件的子字符串是否大于0int index_arr[1000]={0};int x = 0;while(right < end){add_char(right,s,window);while(Is_ok(window,p)&&left < end)字符串是异位字符串的前提1是两字符字符种类数量一样{int len1 = strlen(window);int len2 = strlen(p);if(len1==len2) //字符串是异位字符串的前提2是两字符字符长度一样{int flag2 = 0;for(int j=0;j<len1;j++){if(window[j] != p[j])//字符串是异位字符串的必要条件是两字符字符不能一模一样{flag2 = 1;}}if(flag2){index_arr[x] = left;x++;flag = 1;}}remove_char(window);left++;}right++;}if(flag){for(int i=0;i<x;i++){if(i != x-1){printf("%d ",index_arr[i]);}else{printf("%d\n",index_arr[i]);}}}else{printf("没有这样匹配的字符串!\n");}return 0;
}
问题4:
C代码4:
和前面有一点不一样,主要是窗口移动不太一样。
#include<stdio.h>
#include<string.h>
#define N 80//向窗口右边添加一个字符,拓宽窗口
void Add_char(char ch,char *window)
{int right = strlen(window);window[right] = ch;
}
//检查窗口字符串是否满足包含字符串t所有字符且数量不少于t
int Is_ok(char *window)
{int windows[128]={0};int w=0;int len1 = strlen(window);for(int i=0;i<len1;i++){w = (int)window[i];windows[w]++;}for(int k = 0;k < 128;k++){if(windows[k] > 1){return 0;//不满足条件}}return 1;//满足条件
}/*判断当前满足条件的窗口字符串和满足条件的上一次结果字符串比较谁更短,并更新结果。
注意这里不要单纯的把指针result指向新结果(也就是窗口),因为窗口会随着循环而改变,
这样无法保留做中的正确结果,应该把结果字符串赋值给指针result指向的空间*/
void maxlen(char *result,char *window)
{int result_len = strlen(result);int window_len = strlen(window);if(result_len < window_len){for(int i = 0;i <= window_len;i++){result[i] = window[i];}}
}//移除窗口左边第1个字符
void remove_char(char *window)
{int len = strlen(window);for(int i= 0;i < len;i++){window[i] = window[i+1];}
}int main()
{//定义所需字符数组char s[N];//存储字符串schar window[N]={'\0'};//窗口内的字符串char result[N]={'\0'};//存储找到的满足条件的最短字符串,这里初始化时将其指向字符串s//输入字符串s和tscanf("%s",s);//定义滑动窗口所需变量int left = 0;//窗口左边界指针int right = 0;//窗口右边界指针int end = strlen(s);//字符串s的长度,窗口滑动的终止点//开始滑动窗口寻找满足条件的最短字符串int flag = 0;while(right < end){Add_char(s[right],window);//拓宽窗口右边界if(Is_ok(window)&&left < end)//窗口满足条件,已包含字符串t所有字符且数量也不少{flag = 1;maxlen(result,window);//更新最短满足条件子串答案}else{remove_char(window);//移除窗口左边第1个字符left++;//窗口左边界边界向前滑动}right++;}if(flag){printf("%d\n",strlen(result));}else{printf("No such string!\n");}return 0;
}
相关文章:

滑动窗口算法(C语言描述)
第一种类型:不固定长窗口 问题1:*** C代码1: #include<stdio.h> #include<string.h> #define N 5int min_len(int len1,int len2) {return (len1 < len2 ? len1:len2); }int main() {int target 0;int num[N];scanf("…...

【已修复】vcruntime140.dll有什么用,vcruntime140.dll缺失如何修复
我是网友,今天非常荣幸能够在这里和大家分享关于电脑找不到vcruntime140.dll无法继续执行代码的解决方法。我相信,在座的许多朋友都曾遇到过这个问题,而今天我将为大家介绍五种有效的解决方法。 首先,让我们来了解一下vcruntime1…...

10月12日,每日信息差
今天是2023年10月12日,以下是为您准备的13条信息差 第一、欧盟投资4.5亿欧元在法国建设电池超级工厂。欧洲投资银行是欧盟的贷款机构,也是世界上最大的跨国银行之一 第二、北京银行推出数字人民币智能合约平台 数字人民币预付资金管理产品在商超场景首…...

网络安全技术(黑客学习)——自学方法
如果你想自学网络安全,首先你必须了解什么是网络安全!,什么是黑客!! 1.无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如 Web 安全技术,既有 Web 渗透2.也有 Web 防…...

引领创新浪潮:“Polygon探寻新技术、新治理、新代币的未来之路!“
熊市是用来建设的,Polygon Labs一直在利用这漫长的几个月来做到这一点。 Polygon 是最常用的区块链之一,每周约有 150 万用户,每天超过 230 万笔交易,以及数千个 DApp,Polygon 最近面临着日益激烈的竞争。虽然从交易数…...

Android 13.0 添加自定义服务,并生成jar给第三方app调用
1.概述 在13.0系统产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 2. …...

PG14归档失败解决办法archiver failed on wal_lsn
问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘,删除主库过期wal文件重做备库后上午进行主备状态巡查,主库向备库发送wal文件正常,但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…...

YB4014是可以对单节磷酸铁锂电池进行恒流/恒压充电管理的集成电路。
概述: YB4014是可以对单节磷酸铁锂电池进行恒流/恒 压充电管理的集成电路。该器件内部包括功率晶 体管,不需要外部的电流检测电阻和阻流二极管 YB4014只需要极少的外围元器件,非常适合于 便携式应用的领域。热调制电路可以在器件的功 耗比较大…...

STL——查找算法及实例
一 前言 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明…...

Ant Design Form.List基础用法
使用 Form.List 使用 项目中需要在新增可以多个如图 代码如下 // An highlighted block <Card title"产品信息" bordered{false}><Form.List name"productList" >{(fields, {add, remove}) > (<>{fields.map((field) > (<Ro…...

怎么优化H5让它可以在300ms以内打开?
移动端H5点击300毫秒延迟问题是由于浏览器为了区分单击和双击事件而导致的,通常会在点击后等待300毫秒以查看是否还会发生第二次点击。为解决这个问题,可以采取以下方法: 使用meta标签: 在HTML文档的头部添加以下meta标签来禁用缩放和调整浏览…...

Zabbix安装出现必要条件检查失败
问题描述 今天在某朋友部署新环境的Zabbix时,系统出现如下的检查失败情况。此环境的基础部分不是我负责,而是其它项目共存的PHP环境,也是挺奇怪的。一般来说,不应该将zabbix与其它系统部署在一起,没有条件哪怕时Docke…...

精通Maven的捷径:一文包揽所有必知必学
Maven是每个Java程序都会遇到的包管理工具,今天整理一下Maven的相关知识,从青铜到王者,一文全了解,我们开始吧! 1、maven是什么,为什么存在?项目结构是什么样子,怎么定位jar 官方网…...

SpringCloud溯源——从单体架构到微服务Microservices架构 分布式和微服务 为啥要用微服务
前言 单体架构好好的,为啥要用微服务呢?微服务究竟是啥,怎么来的,有啥优缺点,本篇博客尝试追根溯源,阐述单体应用到分布式,微服务的演变,微服务架构的定义及优缺点,厘清相关的概念。…...

springboot 配置 servlet filter 2
springboot 配置 servlet filter 2 以配置Druid为例 Servlet WebServlet(urlPatterns "/druid/*",initParams {WebInitParam(name "loginUsername", value "admin"),// 登录用户名WebInitParam(name "loginPassword", value …...

前端axios下载导出文件工具封装
使用示例: import { fileDownload } from /utils/fileDownloadfileDownload({ url: process.env.VUE_APP_BASE_URL /statistic/pageList/export, method: post, data: data })工具类: import store from ../store/index import {getAccessToken } fro…...

Web应用防火墙的性能优化技术
Web应用防火墙(WAF)是企业网络安全的重要屏障,其性能直接影响到网络服务的质量和安全。本文详细探讨了WAF性能优化的几种技术,旨在为网络安全专业人员提供实用的参考。 规则优化 1.1 精简规则集 规则评估:定期评估规…...

华为HCIP题库h12-821题库新增30题
901、 (多选题)下面关于BGP中的公认属性的描述,正确的是 A、公认必属性是所有BGP路由器都识别,且必须存在于Updata消息中 B、BGP必须识别所有公认属性 C、公认属性分为公认必遵和可选过渡两种 D、公认任意属性是所有BGP造由器…...

智慧办公数据可视化大屏设计(数据可视化)、大数据、数据大屏、办公数据大屏、办公数据
本次分享的作品是用软件Axure8.0(兼容9和10)制作的智慧办公数据进行的可视化大屏设计,主要是针对办公的综合数据、工位数据、会议室数据、访客数据、能耗数据以及设备智控数据进行可视化数据分析。 1、综合分析:对办公室的整体数据、空气质量…...

echarts实现横轴刻度名倾斜展示,并且解决文字超出部分消失问题
需求背景: xAxis.axisLabel. interval如果不手动设值的话,默认就是‘auto’,会采用标签不重叠的策略间隔显示标签。当数据量特别大的时候,展示出来的刻度标签就会很少,导致用户体验不好。如下图所示: 如果…...

awk常用统计命令
统计列的某元素个数 # 统计第4列为0的个数 awk $4 0 { count } END { print count } your_file.txt awk $4 0 { print } your_file.txt # 第4列为0的行打印到屏幕 awk $4 0 your_file.txt...

Linux:【Kafka四】集群介绍与单机搭建
目录 环境简介 一、搭建kafka集群 1.1、复制出两个kafka的配置文件 1.2、修改配置文件中的如下属性 二、启动kafka集群 三、可校验kafka三个节点是否均启动成功 四、查看集群中主题的分区和副本 4.1、新建一个包含了分区和副本的主题 4.2、查看该主题的详细信息 五、…...

代码随想录算法训练营Day52|动态规划11
代码随想录算法训练营Day52|动态规划11 文章目录 代码随想录算法训练营Day52|动态规划11一、123.买卖股票的最佳时机III二、188.买卖股票的最佳时机IV 买卖股票 难 一、123.买卖股票的最佳时机III class Solution {public int maxProfit(int[] prices) {int[] dp new int[4]…...

Android渲染系列之原理概述篇
屏幕硬件 渲染离不开屏幕,Android中的屏幕碎片化比较严重,尺寸大小不一,材质也是屏幕重要的因素。 目前智能手机主流的屏幕可分为两大类即液晶显示器; LCD (Liquid Crystal Display) 液晶显示器OLED (Organic Light Emitting Diode…...

类图 UML从入门到放弃系列之二
1.劝退说明(开个玩笑) UML包含有许多小组件、修饰符以及其他小巧复杂的东西。UML的内容相当庞大,以至于你可以花大量的时间把自己修成一个UML语言律师,并能够完成所有律师能够完成的工作:编写出所有人都无法理解的文档。现在流行的敏捷开发倡…...

诊断用抗原抗体——博迈伦
抗原抗体诊断是一种常见的临床诊断方法,它通过检测人体内特定抗原或抗体的存在来确定某种疾病或感染的存在与否。这种诊断方法可以用于许多不同的疾病和感染的检测,如传染病、自身免疫病、肿瘤等。 抗原抗体诊断的原理是基于抗原与抗体之间的特异性反应。…...

156 - Ananagrams (UVA)
题目链接如下: Online Judge 我的代码如下: #include <iostream> #include <string> #include <vector> #include <map> #include <algorithm> // #define debugint main(){#ifdef debugfreopen("0.txt", &q…...

vue3入门
一. Vue3的优势 二. 使用create-vue搭建Vue3项目 2.1 认识create-vue create-vue是Vue官方新的脚手架工具,底层切换到了 vite (下一代前端工具链),为开发提供极速响应 2.2 使用create-vue创建项目 前置条件 - 已安装16.0或更高版…...

上机实验二 设计单循环链表 西安石油大学数据结构
实验名称:设计单循环链表 (1)实验目的:掌握线性表的链式存储结构;掌握单循环链表及其基本操作的实现。 (2)主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证…...

小谈设计模式(28)—解释器模式
小谈设计模式(28)—解释器模式 专栏介绍专栏地址专栏介绍 解释器模式角色分析抽象表达式(Abstract Expression)终结符表达式(Terminal Expression)非终结符表达式(Non-terminal Expression&…...