LeetCode 热题 100——无重复字符的最长子串(滑动窗口)

news2024/11/16 9:44:07

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目解析

从s字符串中,去找出连续的子串,使该子串中没有重复字符,返回它的最长长度。

暴力枚举

依次以第一个、第二个、第三个等等为起点去遍历字符串,并且找出不连续子串的最大长度。我们可以借助哈希来解决不重复这个操作。

代码如下

class Solution 
{
public:
    int lengthOfLongestSubstring(string s) 
    {
        int n=s.size();
        int ret = 0;
        for(int i=0;i<n;i++)
        {
            // 每次换遍历起点的时候都重新创建一个新的哈希表
            int hash[128]={0};
            for(int j=i;j<n;j++)
            {
                // 将该遍历字符插入哈希表
                hash[s[j]]++;
                // 如果该位置字符的次数>1 则存在重复元素 直接跳出
                if(hash[s[j]]>1)
                break;
                // 计算最大长度
                ret=max(ret,j-i+1);
            }
        }
        return ret;
    }
};

滑动窗口

暴力枚举的缺点

从我们暴力枚举画图的过程中我们能发现一个事情。如图所示:

注意五角星的位置,我们能发现当我们依次去使用第二个字符为起点的时候,依然是遍历到了此位置,那么是为什么呢?

原因是我们原字符串中的a并没有移走,因此,我们就算以第二个字符作为起点,等到遍历到第二个a的时候依然是重复的,那么我们能不能遍历的时候先把重复的元素给移除掉,然后再进行遍历呢?

那么我们就引出了我们的滑动窗口操作。 

滑动窗口步骤

我们滑动窗口分为几个简单的步骤:

1.定义两个边界的变量 -- left=0,right=0

2.进窗口 -- 让字符进入哈希表
3.判断 -- 窗口内出现重复字符
  出窗口 -- 从哈希表中删除该字符

4.更新结果

图解

代码如下:

class Solution 
{
public:
    int lengthOfLongestSubstring(string s) 
    {
        int hash[128]={0};
        int n=s.size();
        int ret =0 ;
        for(int left=0,right=0;right<n;right++)
        {
            hash[s[right]]++;
            while(hash[s[right]]>1)
                hash[s[left++]]--;
            ret=max(right-left+1,ret);
        }
        return ret;
    }
};

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

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

相关文章

Python小知识 - Python爬虫进阶:如何克服反爬虫技术

Python爬虫进阶&#xff1a;如何克服反爬虫技术 爬虫是一种按照一定的规则&#xff0c;自动抓取网页信息的程序。爬虫也叫网页蜘蛛、蚂蚁、小水滴&#xff0c;是一种基于特定算法的自动化程序&#xff0c;能够按照一定的规则自动的抓取网页中的信息。爬虫程序的主要作用就是从一…

springboot自动装配原理,手写一个starter。

文章目录 springboot自动装配原理手写starter手写starter总结&#xff1a; springboot自动装配原理 口述&#xff1a; springboot自动装配的话它其实就是只需要我们添加一个starter起步依赖&#xff0c;它就能完成这个依赖组件相关Bean的自动注入&#xff0c;其实就是自动的将…

ORB-SLAM2算法13之跟踪线程Tracking

文章目录 0 引言1 跟踪线程Tracking1.1 概述1.2 初始化1.2.1 单目初始化1.2.2 双目/RGBD初始化 1.3 跟踪方法1.3.1 恒速模型跟踪1.3.2 参考关键帧跟踪1.3.3 重定位跟踪 1.4 局部地图跟踪1.4.1 流程1.4.2 更新局部关键帧1.4.3 更新局部地图点1.4.4 进一步优化 1.5 关键帧生成1.5…

windows编程之线程同步万字总结(创建线程,互斥对象,互斥事件,信号量,关键段,多线程群聊服务器)

文章目录 创建线程方法一_beginthreadex函数讲解使用示例&#xff1a; 方法二CreateThread函数讲解:使用示例: 互斥对象:创建互斥对象CreateMutex 互斥事件介绍创建或打开一个未命名的互斥事件对象 信号量介绍信号量的相关函数使用示例 关键段相关函数错误使用示例正确使用示例…

vite介绍

vite vite是一种新的前端构建工具&#xff0c;vite借助了浏览器对ESM的支持&#xff0c;采用和传统webpack打包完全不一致的unbundle打包机制&#xff1b; vite的快主要体现在两个方面&#xff0c;快速的冷启动和快速的热更新 快速的冷启动&#xff1a;vite只需启动一台静态页…

如何将Express项目部署到Vercel

什么是Vercel&#xff1f; 想必好多前端同学都知道Vercel吧&#xff01;如果还不了解的同学也没关系&#xff0c;好好看这篇文章&#xff0c;认识认识Vercel&#xff0c;我想对你部署项目有一定帮助。 Vercel 是一个云平台&#xff0c;用于托管和部署静态网站、前端应用程序以…

2023年无形资产评估研究报告

第一章 无形资产概况 1.1 定义 无形资产是一种缺乏物质实体的资产。例如&#xff0c;专利、版权、特许权、商誉、商标和商号&#xff0c;以及软件等。这与物质资产&#xff08;如机器、建筑等&#xff09;和金融资产&#xff08;如政府证券等&#xff09;形成了对比。无形资产…

Mybatis 动态SQL – 使用choose标签动态生成条件语句

之前我们介绍了if,where标签的使用&#xff1b;本篇我们需要在if,where标签的基础上介绍如何使用Mybatis提供的choose标签动态生成条件语句。 如果您对if,where标签动态生成条件语句不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybat…

将序数与比特币智能合约集成:第 1 部分

将序数与比特币智能合约集成&#xff1a;第 1 部分 最近&#xff0c;比特币序数在区块链领域引起了广泛关注。 据称&#xff0c;与以太坊 ERC-721 等其他代币标准相比&#xff0c;Ordinals 的一个主要缺点是缺乏对智能合约的支持。 我们展示了如何向 Ordinals 添加智能合约功…

插入排序,选择排序,交换排序,归并排序和非比较排序(C语言版)

前言 所谓排序&#xff0c;就是将一组数据按照递增或者递减的方式进行排列&#xff0c;让这组数据变得有序起来。排序在生活中运用的是十分广泛的&#xff0c;各行各业都用到了排序&#xff0c;比如我们在网购的时候就是按照某种排序的方式来选择东西的。所以去了解排序的实现也…

vue 使用qrcode生成二维码并可下载保存

安装qrcode npm install qrcode --save代码 <template><div style"display: flex; flex-direction: column; align-items: center; justify-content center;"><div>查看溯源码&#xff0c;<a id"saveLink" style"text-decorati…

Ae 效果:CC Glue Gun

生成/CC Glue Gun Generate/CC Glue Gun CC Glue Gun&#xff08;CC 胶水枪&#xff09;可以用于生成仿佛由胶水枪绘制的线条或图案&#xff0c;它模拟了胶水枪绘制在不同表面上的纹理和反光效果。 CC Glue Gun 效果实质上是通过设置画笔笔触的位置来构成画笔描边路径&#xff…

ModaHub魔搭社区专访百度智能云李莅:向量数据库市场会不会更卷?

ModaHub魔搭社区:在当今的信息化时代,数据库技术已经渗透到了我们生活的各个角落。传统的关系型数据库在市场上的竞争已经非常激烈,据统计,市面上有数百种不同类型的数据库产品在竞争。那么,在未来,随着人工智能和大数据技术的发展,向量数据库市场会否也会陷入同样的激烈…

js中如何判断一个变量的数据类型?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐typeof 运算符⭐instanceof 运算符⭐Object.prototype.toString 方法⭐Array.isArray 方法⭐自定义类型检查⭐null 和 undefined 检查⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…

ClickHouse进阶(七):Clickhouse数据查询-1

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

RK3568-i2c-适配8010rtc时钟芯片

硬件连接 从硬件原理图中可以看出&#xff0c;rtc时钟芯片挂载在i2c3总线上&#xff0c;设备地址需要查看芯片数据手册。编写设备树 &i2c3 {status "okay";rx8010: rx801032 {compatible "epson,rx8010";reg <0x32>;}; };使能驱动 /kernel/…

NPM 常用命令(三)

目录 1、npm compltion 1.1 描述 2、npm config 2.1 常用命令 2.2 描述 set get list delete edit fix 2.3 配置 json global editor location long 3、npm dedupe 3.1 描述 3.2 配置 4、npm deprecate 4.1 命令使用 4.2 描述 4.3 配置 registry ot…

【huggingface】数据集及模型下载并保存至本地

目录 数据集ChnSentiCorppeoples_daily_ner 模型bert-base-chinesehfl/rbt3t5-baseopus-mt-zh-enChinese_Chat_T5_Base 环境&#xff1a;没有代理&#xff0c;无法访问部分国外网络 数据集 正常情况下通过load_dataset加载数据集&#xff1b;save_to_disk保存至本地&#xff1b…

佳作导读 | 《C++ Core Guidelines》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 佳作导读 | 《C Core Guidelines》 《C Core Guidelines》由Bjarne Stroustrup和Herb Sutter等共同编写关于使用C编程语言的指南&#xff1b;旨在提供关于如何使用C进…

Linux常用命令——csplit命令

在线Linux命令查询工具 csplit 将一个大文件分割成小的碎片文件 补充说明 csplit命令用于将一个大文件分割成小的碎片&#xff0c;并且将分割后的每个碎片保存成一个文件。碎片文件的命名类似“xx00”&#xff0c;“xx01”。csplit命令是split的一个变体&#xff0c;split只…