每日一题 包含不超过两种字符的最长子串

目录

1.前言

2.题目解析

3.算法原理

4.代码实现


1.前言

首先我打算介绍一下,我对滑动窗口的理解。

滑动窗口可以分为四个步骤:

  1. 进窗口: 在这一步骤中,我们决定了要在窗口中维护的信息。例如,在这个问题中,我们需要维护字符种类的个数。只要字符种类个数不超过2个,窗口就是合法的,我们就可以继续向右移动窗口。

  2. 判断: 在进入窗口后,我们需要检查窗口是否变得非法。如果窗口不再合法,我们就需要执行出窗口的操作。

  3. 出窗口: 出窗口的过程是从一个非法窗口恢复到合法窗口的过程。我们通过移动左边界指针来实现这一点。

  4. 更新结果: 在每个合法窗口中,我们可能需要更新问题的最优解。这可能会发生在进窗口、判断或出窗口的任何阶段。

        滑动窗口算法的核心思想是使用两个同向指针(通常是左右指针)来定义一个窗口,并根据问题的要求移动窗口的位置,以达到解决问题的目的。这种算法通常能够有效地减少重复计算,并在线性时间内解决许多问题。

2.题目解析

包含不超过两种字符的最长子串_牛客题霸_牛客网

窗口中的元素不大于2为合法窗口,求最长的合法窗口。

3.算法原理

  1. 使用滑动窗口: 采用滑动窗口算法来解决问题。通过维护一个窗口,窗口内的字符种类个数不超过两个,来找到满足条件的最长子串。

  2. 初始化窗口和变量: 定义两个指针 leftright,分别指向窗口的左右边界。初始化一个大小为 26 的整型数组 hash,用于记录窗口内每种字符出现的次数。另外,定义一个变量 flag 用于记录窗口内不同字符的个数,初始值为 0;定义一个变量 max 用于记录最长子串的长度,初始值为 -1。

  3. 移动右指针: 右指针向右移动,进入窗口。每次移动右指针,更新窗口内字符的出现次数,并根据情况更新 flag 的值。

  4. 判断窗口合法性: 判断窗口是否合法,即窗口内不同字符的个数是否超过两个。如果超过两个,需要移动左指针缩小窗口,直到窗口重新合法。

  5. 更新最长子串长度: 在每次窗口合法的情况下,更新 max 的值,记录当前最长子串的长度。

  6. 返回结果: 循环结束后,返回 max,即最终的结果,即最长子串的长度。

4.代码实现

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNext()) { // 注意 while 处理多个 caseString str = in.next();//1.通过hash表 + flag变量,来判断窗口是否合法int[] hash = new int[26];int flag = 0, max = -1;int left = 0,right = 0;char[] chs = str.toCharArray();int n = chs.length;while(right < n){//2.进窗口if (hash[chs[right] - 'a'] == 0){flag++;}hash[chs[right] - 'a']++;right++;while(flag > 2){//违法窗口//3.出窗口hash[chs[left] - 'a']--;if (hash[chs[left] - 'a'] == 0){flag--;}left++;}//4.更新结果max = Math.max(max,right - left);}System.out.println(max);}}
}

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

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

相关文章

什么是JavaScript渗透测试?

JavaScript开发的WEB应用和PHP&#xff0c;JAVA, NET等区别在于即没有源代码&#xff0c;也可以通过浏览器查看源代码。 所以相当于JavaScript开发的WEB应用属于白盒测试(默认有源码参考)

视觉SLAM-基本原理

以视觉传感器作为感知方式的SLAM称为视觉SLAM。按照建图稀疏程度来分&#xff0c;视觉SLAM技术可以分为稀疏SLAM&#xff0c;半稠密SLAM和稠密SLAM。虽然同为SLAM系统&#xff0c;但它们的侧重点并不完全一样。SLAM 系统最初的设想是为机器人提供在未知环境中探索时的定位和导航…

如何识别和使用GRS证书

申请TC时的问题 1.没有及时添加分包商信息&#xff0c;TC无法申请 申请TC前&#xff0c;承担“染色”加工的分包商没有增加到GRS证书上&#xff1b; 2.发票地址不在证书上&#xff0c;TC无法申请 公司办公地址与注册地址不同时&#xff0c;证书上没有开票单位的地址&#xff1b…

舆情公关是什么?如何处理企业网络舆情?

舆情就是舆论的情况&#xff0c;在公关领域有暗指负面舆论的意思。总之&#xff0c;舆情公关是目前公关领域的重要分支&#xff0c;很多企业在舆情公关方面折戟&#xff0c;目前越来越多的企业开始重视舆情公关&#xff0c;成为企业一项常规的工作。 什么是舆情公关&#xff1f…

大模型框架:vLLM

目录 一、vLLM 介绍 二、安装 vLLM 2.1 使用 GPU 进行安装 2.2 使用CPU进行安装 2.3 相关配置 三、使用 vLLM 3.1 离线推理 3.2 适配OpenAI-API的API服务 一、vLLM 介绍 vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架。它利用了全新的注意力算法「PagedAtten…

Codeforces Round 946 (Div.3)

C o d e f o r c e s R o u n d 946 ( D i v . 3 ) \Huge{Codeforces~Round~946~(Div.3)} Codeforces Round 946 (Div.3) 题目链接&#xff1a;Codeforces Round 946 (Div. 3) 文章目录 Problems A. Phone Desktop题意思路标程 Problems B. Symmetric Encoding题意思路标程 Pr…

Java-RabbitMQ

RabbitMQ使用场景 1、跨系统异步通信 2、多应用之间解耦 3、应用内流程同步变异步 4、整体架构即采用消息驱动 5、应用内部解耦 RabbitMQ内部角色 角色简介生产者消息创建者消费者消息接收者代理RabbitMQ本身&#xff0c;用于存储转发消息&#xff0c;快递功能 RabbitMQ有哪…

ubuntu 配置用户登录失败尝试次数限制

前言&#xff1a; 通过修改pam配置来达到限制密码尝试次数&#xff01; 1&#xff1a;修改 /etc/pam.d/login 配置&#xff08;这里只是终端登录配置&#xff0c;如果还需要配置SSH远程登录限制&#xff0c;只配置下面的 /etc/pam.d/pam.d/common-auth 即可&#xff09; vim…

SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端?

SpringCloud的Config配置中心&#xff0c;为什么要分Server服务端和Client客户端&#xff1f; 在SpringCloud的Config配置中心中分了Server服务端和Client客户端&#xff0c;为什么需要这样分呢&#xff1f;它的思想是所有微服务的配置文件都放到git远程服务器上&#xff0c;让…

Java---图书管理系统(练习版)

1.主函数 import book.Book; import book.BookList; import user.AdminUser; import user.NormalUser; import user.User;import java.util.Scanner;public class Main {public static User Login(){//确认你的身份System.out.println("请输如你的名字");Scanner sc…

Elasticsearch集群搭建学习

Elasticsearch集群聚合、集群搭建 RestClient查询所有高亮算分控制 数据聚合DSL实现Bucket聚合DSL实现Metrics聚合RestAPI实现聚合 拼音分词器如何使用拼音分词器&#xff1f;如何自定义分词器&#xff1f;拼音分词器注意事项&#xff1f; 自动补全数据同步集群搭建ES集群结构创…

CSS3边框与轮廓

CSS3边框与轮廓 border-radius border-radius 属性用于设置元素边框的圆角半径。通过这个属性,您可以使元素的角呈现圆形或椭圆形外观,而不是传统的直角。其语法格式如下: .element {border-radius: [horizontal-radius vertical-radius] | [radius];}horizontal-radius 和…

蓝桥杯备赛——DP【python】

一、小明的背包1 试题链接&#xff1a;https://www.lanqiao.cn/problems/1174/learning/ 问题描述 输入实例 5 20 1 6 2 5 3 8 5 15 3 3 输出示例 37 问题分析 这里我们要创建一个DP表&#xff0c;DP&#xff08;i&#xff0c;j&#xff09;表示处理到第i个物品时消耗j体…

Atlas 200 DK(Model 3000)安装MindSpore Ascend版本

一、参考资料 mindspore快速安装 二、重要说明 经过博主多次尝试多个版本&#xff0c;Atlas 200 DK&#xff08;Model 3000&#xff09;无法安装MindSpore Ascend版本。 三、准备工作 1. 测试环境 设备型号&#xff1a;Atlas 200 DK(Model: 3000) Operating System Vers…

Vue框架案例学习

1.项目搭建 利用vitets框架进行搭建 npm create vite 启动项目 npm run dev 2.项目配置 ①运行项目&#xff0c;浏览器自动打开 package.json "scripts": {"dev": "vite --open",} ②配置src文件夹的别名 在根目录下配置tsconfig.json文件 …

依赖的各种java库(工具类) :fastjson,lombok,jedis,druid,mybatis等

lombok 功能&#xff1a; Lombok 是一个实用的Java类库&#xff0c;可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代码。 导入包&#xff1a;使用Lombok首先要将其作为依赖添加到项目中&#xff0c;在pom.xml文件中手动添加 <dependency><groupId&g…

提取COCO 数据集的部分类

1.python提取COCO数据集中特定的类 安装pycocotools github地址&#xff1a;https://github.com/philferriere/cocoapi pip install githttps://github.com/philferriere/cocoapi.git#subdirectoryPythonAPI若报错&#xff0c;pip install githttps://github.com/philferriere…

【CTF Web】CTFShow web5 Writeup(SQL注入+PHP+位运算)

web5 1 阿呆被老板狂骂一通&#xff0c;决定改掉自己大意的毛病&#xff0c;痛下杀手&#xff0c;修补漏洞。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\…

判断视频moov的位置

前言 MP4文件由若干称为Atom&#xff08;或称为box&#xff09;的数据对象组成&#xff0c;每个Atom的起首为四个字节的数据长度&#xff08;Big Endian&#xff09;和四个字节的类型标识&#xff0c;数据长度和类型标志都可以扩展。Atom可以嵌套&#xff0c;即其数据域可以由…

24款奔驰S450升级原厂后排娱乐系统 主动氛围灯有哪些功能

24款奔驰S400豪华升级原厂主动氛围灯与后排娱乐系统&#xff1a;画蛇添足还是锦上添花&#xff1f; 在当今汽车市场竞争激烈的环境下&#xff0c;汽车制造商们为了满足消费者的多元化需求&#xff0c;不断推出各种升级配置和豪华版本。24款奔驰S400豪华版作为奔驰S级的一款重要…