《剑指 Offer》专项突破版 - 面试题 16 : 不含重复字符的最长子字符串(C++ 实现)

题目链接:LCR 016. 无重复字符的最长子串 - 力扣(LeetCode)

题目

输入一个字符串,求该字符串中不含重复字符的最长子字符串的长度。例如,输入字符串 "babcca",其最长的不含重复字符的子字符串是 "abc",长度为 3。

分析

和前面的题目一样,此处还是用一个哈希表统计子字符串中字符出现的次数。如果一个子字符串中不含重复的字符,那么每个字符都只出现一次,它们在哈希表中对应的值为 1。没有在子字符串中出现的其他字符对应的值都是 0。也就是说,如果子字符串中不含重复字符,那么它对应的哈希表中没有比 1 大的值

下面仍然用两个指针来定位一个子字符串,其中第 1 个指针指向子字符串的第 1 个字符,第 2 个指针指向子字符串的最后一个字符。接下来分析如何移动这两个指针。

如果两个指针之间的子字符串不含重复的字符,由于目标是找出最长的子字符串,因此可以向右移动第 2 个指针,在子字符串的最右边增加新的字符,然后判断新的字符在子字符串中有没有重复出现。如果还是没有重复的字符,则继续向右移动第 2 个指针,在子字符串中添加新的字符

如果两个指针之间的子字符串中含重复的字符,则可以向右移动第 1 个指针,删除子字符串中最左边的字符。如果删除最左边的字符之后仍然包含重复的字符,则继续向右移动第 1 个指针删除最左边的字符。如果删除最左边的字符之后不再包含重复的字符,就可以向右移动第 2 个指针,在子字符串的最右边添加新的字符

代码实现

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

由于这个题目没有说明字符串中只包含英文字母,那么就有可能包含数字或其他字符,因此字符就可能不止 26 个。假设字符串中只包含 ASCII 码的字符,由于 ASCII 码总共有 128 个字符,因此用来模拟哈希表的数组的长度就是 128

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

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

相关文章

Oracle学习笔记——基础一起学 14

第十四天 DECODE的简单例子 用case实现 --DECODE的简单例子 --用case实现 select id,name, case sex when 1 then 男 when 2 then 女 end 性别 from student; --DECODE取出一行内两列中的较大值 --先建表 create table sales(month char(2),sales_tv number,sales_…

C#MQTT编程07--MQTT服务器和客户端(wpf版)

1、前言 上篇完成了winform版的mqtt服务器和客户端&#xff0c;实现了订阅和发布&#xff0c;效果666&#xff0c;长这样 这节要做的wpf版&#xff0c;长这样&#xff0c;效果也是帅BBBB帅&#xff0c;wpf技术是cs程序软件的福音。 wpf的基础知识和案例项目可以看我的另一个专…

Spring 如何解决循环依赖?

Spring解决循环依赖的主要方式是通过使用三级缓存&#xff08;three-level cache&#xff09;来管理Bean的创建过程。Spring容器在创建Bean时&#xff0c;会将Bean的创建状态存储在三级缓存中&#xff0c;以解决循环依赖的问题。 以下是Spring解决循环依赖的基本原理&#xff…

Parade Series - RTSP - Web

Cron Startup Scripts └─ lt-init.cmd├─ lt-server.cmd│ └─ lt-rtsp-proxy-server.cmd│ └─ lt-rtsp-proxy-agent.cmd└─ lt-push.cmd└─ lt-rtsp-cam-daemon.cmd└─ lt-rtsp-cam-worker.cmdlt-init.cmd :: :: PLEASE DO NOT EDIT THIS FILE :: ECHO OFF…

Qt —— 编译Qt5版本QFTP库,并实现连接服务、获取列表、上传、下载、删除文件等操作(附源码、附基于Qt5编译好的QFTP库)

示例效果1 示例效果2 介绍 QFTP是Qt4的库,Qt5改用了QNetworkAccessManager来代替。但是Qt5提供的QNetworkAccessManager仅支持FTP的上传和下载,所以只能将QFTP库编译为Qt5的库来进行调用。 QFTP在Github的下载地址:https://github.com/qt/qtftp 客户端源码生成的release结果…

安全 漏洞扫描 OSSIM

安全 漏洞扫描OSSIM OSSIM &#xff08;4&#xff09;硬件选择&#xff0c;可以采用品服务器&#xff0c;对于中小企业也可以根据自己需求&#xff0c;以OSSIM 4.8系统为例&#xff0c;目前系统对多核性能支持的比较好&#xff0c;推荐采用至强E系列处理器&#xff0c;OSSIM在…

IDEA项目启动报错之Command too long

使用IDEA最新的版本2023-3月份社区版本&#xff0c;启动之前没问题的项目突然报错如下&#xff1a; Error running VipServiceApplication: Error running // VipServiceApplication.Command line is too long. Shorten the command line via // JAR manifest or via a // clas…

开发安全之:Log Forging

Overview error_log($content . "\r\n", 3, $this->logFile);&#xff0c;该代码将未经验证的用户输入写入日志。攻击者可以利用这一行为来伪造日志条目或将恶意内容注入日志。 Details 在以下情况下会发生 Log Forging 的漏洞&#xff1a; 1. 数据从一个不可…

运放【之噪声】

电流噪声和电压噪声 我们一般评估噪声&#xff0c;还看对输出端噪声电压的贡献&#xff0c;因为电流乘以电阻等于电压&#xff0c;因此&#xff0c;最终的噪声大小还跟电路中电阻的取值有很大关系。显然&#xff0c;电阻越大&#xff0c;那么噪声电压就越大。反之电阻越小&…

设计模式——建造者模式(Builder Pattern)

概述 建造者模式是较为复杂的创建型模式&#xff0c;它将客户端与包含多个组成部分&#xff08;或部件&#xff09;的复杂对象的创建过程分离&#xff0c;客户端无须知道复杂对象的内部组成部分与装配方式&#xff0c;只需要知道所需建造者的类型即可。它关注如何一步一步创建一…

09 STM32 - PWM

9.1 PWM简介 脉冲宽度调制(Pulse Width Modulation,简称PWM)&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点&#xff0c;就是对脉冲宽度的控制。 9.2 PWM波原理 如下图所示&#xff0c;使用定时器定时&#xff0c;从0开始&#x…

Ubuntu系统Git的安装配置及使用笔记(更新中)

Ubuntu下Git的下载及配置 (1)、下载git 打开终端命令窗口,输入&#xff1a;sudo apt-get install git 提示&#xff1a;sudo命令是用来以其他身份来执行命令&#xff0c;预设的身份为root,使用sudo时必须先输入密码 (2)、可以使用命令git --version查看git的版本号 (3)、设置…

项目中常用的ahoos

项目中常用的ahoos如下 useMount、useUnmountuseRequestuseBooleanuseInfiniteScrolluseLocalStorageStateuseInViewportuseUpdateEffectuseLayoutEffectuseMapuseThrottleFnuseDebounceFn

Java内置锁:深度解析StampedLock并发类

内容摘要 StampedLock类是一种高性能的读写锁&#xff0c;它通过引入乐观读和写锁的优化机制&#xff0c;提高了多线程环境下的并发性能&#xff0c;他支持三种访问模式&#xff1a;悲观读、写和乐观读&#xff0c;可以根据不同的业务场景选择适合的锁策略&#xff0c;相比传统…

基于云化测试平台的功能拨测与告警

一、前言 1、拨测是什么 拨测是指对系统、应用或网站进行测试&#xff0c;以确定其是否正常工作。在软件开发的不同阶段&#xff0c;拨测都扮演着至关重要的角色。它可以帮助开发团队及时发现和解决问题&#xff0c;确保软件的质量和稳定性。 虽然拨测是保证软件质量的必要步…

Qt/QML编程之路:OpenGL的示例(39)

Qt编程之后,会发现有版本问题,有时候一个示例不同的版本下可能会跑不同,有些Qt5跑不同Qt6已经完善,可以跑通。 我就看到有个关于OpenGL的示例: 这个示例是演示怎么基于OpenGL编程的,但是调试时却发现glViewXXX等gl打头的函数说找不到reference,或者什么link不上之类的错…

FindMy技术与游戏手柄结合

游戏手柄作为游戏的重要配件&#xff0c;它极大地提升了玩家的游戏体验&#xff0c;推动了游戏市场的不断扩大。游戏手柄的触摸感应技术为游戏开发者提供了更多的创意空间&#xff0c;也为硬件制造商带来了新的商机。游戏手柄的个性化定制也为玩家社区的发展提供了动力&#xf…

红队打靶练习:BOB: 1.0.1

目录 信息收集 1、netdiscover 2、nmap 3、nikto 4、whatweb 目录探测 1、dirb 2、gobuster 3、dirsearch WEB 主页&#xff1a; robots.txt 其他页面 反弹shell 提权 系统信息收集 jc账户 本地提权 信息收集 1、netdiscover ┌──(root㉿ru)-[~/kali] └…

命令执行拼接符实例图解

命令执行常用到的5个拼接符&#xff0c;分别是逻辑与&#xff08;&&&#xff09;、逻辑或&#xff08;||&#xff09;、按位与&#xff08;&&#xff09;、按位或&#xff08;|&#xff09;和linux系统特有的分号&#xff08;;&#xff09; 1、&&&#xf…

运维平台介绍:视频智能运维平台的视频质量诊断分析和告警中心

目 录 一、视频智能运维平台介绍 &#xff08;一&#xff09;平台概述 &#xff08;二&#xff09;结构图 &#xff08;三&#xff09;功能介绍 1、运维监控 2、视频诊断 3、巡检管理 4、告警管理 5、资产管理 6、工单管理 7、运维…