C语言之滑动窗口问题

一、题目:

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

假设字符串中只包含从 a 到 z 的字符。

数据范围

输入字符串长度 [0,1000][0,1000]。

样例
输入:"abcabc"输出:3

二、代码展示 

#include <stdio.h>
#include <string.h>int lengthOfLongestSubstring(char* s) {int n = strlen(s);int maxLength = 0;int start = 0;int charIndex[26];  // 记录每个字符最后出现的位置// 初始化charIndex数组,将所有字符的最后出现位置设置为-1for (int i = 0; i < 26; i++) {charIndex[i] = -1;}for (int end = 0; end < n; end++) {// 如果字符已经出现过,并且出现位置在当前窗口内,更新窗口的起始位置if (charIndex[s[end] - 'a'] >= start) {start = charIndex[s[end] - 'a'] + 1;}// 更新字符的最后出现位置charIndex[s[end] - 'a'] = end;// 更新最大长度if (end - start + 1 > maxLength) {maxLength = end - start + 1;}}return maxLength;
}int main() {char input[] = "abcabc";int result = lengthOfLongestSubstring(input);printf("输出:%d\n", result);return 0;
}

这个程序中,我们使用了一个长度为26的数组charIndex来记录每个字符最后一次出现的位置。我们使用两个指针startend来构建滑动窗口,其中start表示窗口的起始位置,end表示窗口的结束位置。在遍历字符串的过程中,我们不断调整窗口的位置,并更新最大长度。 

三、解析 

for (int end = 0; end < n; end++) {// 如果字符已经出现过,并且出现位置在当前窗口内,更新窗口的起始位置if (charIndex[s[end] - 'a'] >= start) {start = charIndex[s[end] - 'a'] + 1;}// 更新字符的最后出现位置charIndex[s[end] - 'a'] = end;// 更新最大长度if (end - start + 1 > maxLength) {maxLength = end - start + 1;}}

 

上面这段代码是解决最长不含重复字符子字符串的核心逻辑。

  1. for (int end = 0; end < n; end++): 这是一个循环,遍历整个字符串。end代表当前窗口的结束位置,从字符串的开头逐步移动到结尾。

  2. if (charIndex[s[end] - 'a'] >= start): 这个条件判断检查当前字符s[end]是否已经在当前窗口中出现过。charIndex[s[end] - 'a']表示字符s[end]上次出现的位置。如果上次出现的位置在当前窗口内(即大于等于start),就说明这个字符重复了。

  3. start = charIndex[s[end] - 'a'] + 1;: 如果发现重复字符,就更新窗口的起始位置为上次出现位置的下一个位置,以确保不包含重复字符。

  4. charIndex[s[end] - 'a'] = end;: 更新字符s[end]的最后一次出现位置为当前位置end

  5. if (end - start + 1 > maxLength): 在每次迭代中,都比较当前窗口的长度(end - start + 1)是否大于已知的最大长度maxLength,如果是,则更新maxLength

整个过程就是通过滑动窗口的方式不断调整窗口的起始和结束位置,确保窗口内的字符都是不重复的,同时不断更新最大长度。最终,maxLength就是最长不含重复字符的子字符串的长度。

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

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

相关文章

flutter保存图片到相册封装工具类

/// 使用 File api import dart:io;/// 使用 Uint8List 数据类型 import dart:typed_data;/// 图片缓存管理 import package:cached_network_image/cached_network_image.dart; import package:flutter/services.dart;/// 使用 DefaultCacheManager 类&#xff08;可能无法自动…

设计模式(八)外观模式

相关文章设计模式系列 1.外观模式简介 外观模式介绍 当我们开发Android的时候&#xff0c;无论是做SDK还是封装API&#xff0c;我们大多都会用到外观模式&#xff0c;它通过一个外观类使得整个系统的结构只有一个统一的高层接口&#xff0c;这样能降低用户的使用成本。 外观…

2279. 网络战争(最小割,01分数规划,二分)

活动 - AcWing 给出一个带权无向图 G(V,E)&#xff0c;每条边 e 有一个权 we。 求将点 s 和点 t 分开的一个边割集 C&#xff0c;使得该割集的平均边权最小&#xff0c;即最小化&#xff1a; ∑(e∈C)we/|C| 注意&#xff1a; 边割集的定义与最小割中的割边的集合不同。在本…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

在linux下配置网桥透明模式防火墙

在 Linux 下配置网桥透明模式防火墙&#xff0c;您可以使用 iptables 或者 nftables 来实现。下面是一个基本的示例&#xff0c;假设您已经有一个网桥 br0&#xff0c;并且想要在网桥上应用透明防火墙规则。 安装必要的工具&#xff1a; sudo apt update sudo apt install brid…

mybatis架构

分为三层&#xff1a;接口层、数据处理层、框架支撑层 那么展开解释每层职责 1.接口层&#xff1a;包含新增、删除、查询、修改接口。其调用方式大致分为两种&#xff1a;一种是基于statementId&#xff0c;一种是基于Mapper接口。另外还维护配置信息的接口 2.数据处理层&am…

Java SpringBoot 创建项目工程输出 Hello World

Java SpringBoot 创建项目工程输出 Hello World 1、新建项目 2、创建 controller 3、编写 Hello World 代码 package com.zhong.demo01.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.Res…

本地项目如何上传到gitee

文章目录 一、在gitee上新建远程仓库二、初始化本地仓库三、执行git命令上传代码 一、在gitee上新建远程仓库 仓库名称必填&#xff0c;路径自动跟仓库名称保持一致 解释说明&#xff1a; 仓库名称&#xff1a;必填&#xff0c;每个仓库都需要有一个名称&#xff0c;同一个码…

Armbian 23.11(Ubuntu 22.04)安装glances不显示docker容器状态解决办法

引流关键词&#xff1a; debian 系统环境信息 注意&#xff01;这里只是交代&#xff01;具体情况无需与我一致&#xff01; 命令输出cat /proc/versionLinux version 6.6.2-edge-rockchip64 (armbiannext) (aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, …

【Leetcode】150. 逆波兰表达式求值

今天做了一道leetcode&#xff0c;题目不算难&#xff0c;基本就是stack的入栈出栈&#xff0c;但我看了一圈别人的代码&#xff0c;感觉不够优雅&#xff0c;所以我想分享一下自己的写法&#xff0c;主要就是用Map和BiFunction优化4个if else Java中&#xff0c;函数是能以对…

kubectl 命令行管理K8S

目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法…

2024年用AI自动直播有效果吗?

在如今全民直播的时代&#xff0c;做短视频和直播已经成为多数企业、实体店必备的技能之一&#xff0c;全国各个头部的品牌&#xff0c;都在纷纷加码直播&#xff0c;甚至已经开启直播矩阵的体系&#xff0c;另外中小型商家也在思考&#xff0c;如何通过抖音直播&#xff0c;让…

量子前沿:美国计算社区联盟CCC发布量子计算进展最新研报!

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;1800字丨12分钟阅读 近日&#xff0c;美国计算社区联盟 (CCC) 发布了过去五年量子计算进展的最新报告。CCC还分享了美国东北大学库里计算机科…

XGB-12:在 Kubernetes 上进行分布式 XGBoost 训练

通过 Kubeflow XGBoost Training Operator 支持在 Kubernetes 上进行分布式 XGBoost 训练和批量预测。 操作步骤 为在 Kubernetes 集群上运行 XGBoost 作业&#xff0c;执行以下步骤&#xff1a; 在 Kubernetes 集群上安装 XGBoost Operator。 XGBoost Operator 旨在管理 XGB…

从零开始学Spring Boot系列-Hello World

欢迎来到从零开始学Spring Boot的旅程&#xff01;我们将从一个非常基础但重要的示例开始&#xff1a;创建一个简单的Spring Boot应用程序&#xff0c;并输出“Hello World”。 1. 环境准备 首先&#xff0c;确保你的开发环境已经安装了以下工具&#xff1a; Java Development …

word、wps插入参考文献

word 首先为参考文献自定义一个编号列表&#xff0c;开始->有序编号->定义新的编号格式&#xff0c;如下图所示&#xff1a; 在输入编号的格式中输入编号列表的形式&#xff0c;然后输入1&#xff1b;将编号样式改为1&#xff0c;2&#xff0c;3形式&#xff0c;不然就会…

dbt-core中的模型

在dbt中&#xff0c;模型&#xff08;model&#xff09;是核心概念之一&#xff0c;它代表了一个或多个SQL查询&#xff0c;这些查询定义了如何从源数据转换和构建目标数据表。除了SQL模型外,还有一个python模型,这里后面再进行探索. 以下是一些关于dbt模型的主要概念和注意事…

趣学贝叶斯定理:贝叶斯定理的先验概率、似然和后验概率(2)

4. 比较非归一化的后验概率 首先&#xff0c;我们需要求出两个后验概率的比值 P ( D ∣ H 1 ) P ( D ∣ H 2 ) \frac{P(D|H1)}{P(D|H2)} P(D∣H2)P(D∣H1)​ 接下来&#xff0c;用贝叶斯定理将其中的每一项都展开。 所以这个后验概率比值告诉我们&#xff0c;在不知道P(D)的…

PostgreSQL 与MySQL 对比使用

一、前言 博主的系统既有 用到MySQL 也有用到PostgreSQL &#xff0c;之所以用到这两种数据库&#xff0c;主要是现在都是国产替代&#xff0c;虽然说这两款数据库也不是国产的&#xff0c;但是相对开源&#xff0c;oracle是不让用了。所以现在使用比较多的就是这两个关系型数据…

Java中文乱码问题几种常见的解决方法

Java中文乱码问题通常是因为字符编码不一致导致的。以下是几种常见的解决方法&#xff1a; 1. **设置JVM编码**&#xff1a;在启动Java程序时&#xff0c;可以通过-Dfile.encodingUTF-8参数来指定JVM使用的字符编码为UTF-8。例如&#xff1a; shell java -Dfile.encodin…