LeetCode 3:寻找最长不含重复字符的子串长度

LeetCode 3:寻找最长不含重复字符的子串长度

在字符串处理中,寻找最长不含重复字符的子串长度是一个经典问题。

问题描述

给定一个字符串 s ,我们需要找出其中不含有重复字符的最长子串的长度。

解决方案

我们可以使用滑动窗口的方法来解决这个问题。滑动窗口是一个区间,它可以通过两个指针来表示。在这个问题中,我们使用两个指针表示子串的左右边界。

我们使用一个哈希集合(unordered_set)来存储当前窗口中的字符,以便快速检查一个字符是否已经在当前窗口中。同时,我们使用两个指针 lefti 来表示当前窗口的左右边界,初始时都指向字符串的开头。

接下来,我们遍历字符串 s,对于每个字符,我们做如下操作:

  1. 如果当前字符已经在窗口中存在,我们需要将左指针 left 移动到当前重复字符的下一个位置,以保证窗口中没有重复字符。
  2. 更新窗口中的字符集合,即将当前字符加入到集合中。
  3. 更新最长不含重复字符的子串的长度。

最终,我们返回最长子串的长度。

代码实现

class Solution {
public:int lengthOfLongestSubstring(string s) {if(s.size() == 0) return 0;   // 如果字符串长度为0直接返回unordered_set<char> set;int maxStr = 0;int left = 0;for(int i = 0; i < s.length(); i++) {while(set.find(s[i]) != set.end()) {set.erase(s[left]);left++;}set.insert(s[i]);maxStr = max(maxStr, i - left + 1);}return maxStr;}
};

示例

让我们通过一个示例来说明上述算法的工作方式:

假设输入字符串为 "abcabcbb",那么算法将按以下步骤执行:

  • 遍历字符串,初始时 left = 0, maxStr = 0
  • i = 0 时,字符 a 不在集合中,加入集合,更新 maxStr = max(maxStr, i - left + 1) = 1
  • i = 1 时,字符 b 不在集合中,加入集合,更新 maxStr = max(maxStr, i - left + 1) = 2
  • i = 2 时,字符 c 不在集合中,加入集合,更新 maxStr = max(maxStr, i - left + 1) = 3
  • i = 3 时,字符 a 在集合中,移动 left 指针到下一个位置,更新 left = 1
  • 以此类推,直到遍历完整个字符串。

最终,返回 maxStr = 3,表示最长不含重复字符的子串长度为3。
对于给定字符串 s 的长度为 n,我们的算法使用了滑动窗口来寻找最长不含重复字符的子串长度。

复杂度分析

时间复杂度分析

  • 遍历字符串: 算法需要遍历一次输入字符串 s,时间复杂度为 O(n),其中 n 是字符串的长度。
  • 滑动窗口操作: 在滑动窗口操作中,我们最多移动左指针 left 和右指针 i 各一次。对于每个字符,我们在常数时间内检查是否在集合中,因此滑动窗口操作的时间复杂度为 O(1)。
  • 因此,总体时间复杂度为 O(n)。

空间复杂度分析

  • 哈希集合: 我们使用了一个哈希集合来存储当前窗口中的字符。在最坏情况下,集合中可能包含字符串中的所有字符,因此空间复杂度为 O(min(n, m)),其中 n 是字符串的长度,m 是字符集的大小(ASCII 字符集为 256)。
  • 其他变量: 我们使用了常数个额外的变量,因此空间复杂度为 O(1)。

总结

通过滑动窗口的方法,我们可以在时间复杂度为 O(n) 的情况下解决这个问题。该方法利用了哈希集合的快速查找特性,使得算法具有高效性能和较好的扩展性,适用于处理大规模的字符串输入。

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

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

相关文章

振动解调用的包络谱计算

1缘起 在振动分析中&#xff0c;对于一些高频频点的分析计算&#xff0c;使用包络谱技术&#xff0c;进而得到特化谱是最适宜的。 1.1 包络谱是什么样子的&#xff1f; 我们看matlab信号分析中提供的一个实例&#xff1a; https://www.mathworks.com/help/signal/ug/comput…

07_html

文章目录 引言前端概述分类 HTML快速入门重要的body标签注释hr标签br标签一些常见的标签标题标签div标签span标签p标签a标签img标签路径问题 ol和ul标签table标签input标签&#xff08;表单元素&#xff09;textarea标签&#xff08;表单元素&#xff09;select标签&#xff08…

Scrapy与分布式开发(2.1.2):python常用网络请求库httpx

Python httpx 模块详细讲解 一、引言 httpx 是一个用于发送 HTTP 请求的 Python 库,它提供了简单易用的 API,支持同步和异步请求,并且具有出色的性能和灵活性。httpx 是 requests 的一个现代替代品,它使用 httpcore 作为底层传输层,支持 HTTP/1.1 和 HTTP/2 协议。 二、…

软考50-上午题-【数据库】-SQL访问控制

一、SQL访问控制 数据控制&#xff0c;控制的是用户对数据的存储权力&#xff0c;由DBA决定。 DBA&#xff1a;数据库管理员。 DBMS数据控制应该具有一下功能&#xff1a; 1-1、授权语句格式 说明&#xff1a; 示例&#xff1a; 1-2、收回权限语句格式 示例&#xff1a; PUBLI…

C#知识点-19(七大设计原则、通过反射破坏单例设计模式、基于Task的异步编程模型、Winform中的异步)

通过反射&#xff0c;破坏单例设计模式 internal class Program{static void Main(string[] args){//懒汉式//for (int i 0; i < 10; i)//{// Thread th new Thread(() > {// LazyManClass lazyManClass LazyManClass.GetLazyMan();// });// th.Start…

Java Spring Boot面试题解析

1. 什么是 Spring Boot&#xff1f;【重点】 多年来&#xff0c;随着新功能的增加&#xff0c;Spring变得越来越复杂&#xff1b;一个Spring项目&#xff0c;我们必须做添加构建路径或添加Maven依赖关系&#xff0c;配置应用程序服务器&#xff0c;添加Spring配置等工作&#…

Flutter开发进阶之Flutter Web加载速度优化

Flutter开发进阶之Flutter Web加载速度优化 通常使用Flutter开发的web加载速度会比较慢,原因是Flutter web需要加载的资源处于国外,以下是据此所做的相应优化。 一、FlutterWeb打包 flutter build web --web-renderer canvaskit使用新命令打包 flutter build web --web-…

matlab批量替换txt文本文件的特定行的内容

1.下图所示&#xff0c;我想要替换第14行。 2.运行代码后&#xff0c;第14行已经更改为需要的内容。 clc,clear; %%----------------------需要更改的地方------------------------------------ % 设置要操作的文本文件路径&#xff0c;替换为你自己的文件路径 path D:\paper_…

【算法与数据结构】复杂度深度解析(超详解)

文章目录 &#x1f4dd;算法效率&#x1f320; 算法的复杂度&#x1f320; 时间复杂度的概念&#x1f309;大O的渐进表示法。 &#x1f320;常见复杂度&#x1f320;常见时间复杂度计算举例&#x1f309;常数阶O(1)&#x1f309;对数阶 O(logN)&#x1f309;线性阶 O(N)&#x…

高防服务器托管应注意什么

选择高防服务器托管主要考虑的因素&#xff1a;1.服务商的服务器大小。2.服务器的防御值大小。3.服务器机房的位置以及机房的资质。 具体内容如下&#xff1a; 1&#xff0e;服务器大小是按照U来定的&#xff0c;U是一种表示服务器外部尺寸的单位(计量单位&#xff1a;高度或厚…

揭示预处理中的秘密!(二)

目录 ​编辑 1. #运算符 2. ##运算符 3. 命名约定 4. #undef 5. 命令行定义 6. 条件编译 7. 头文件的被包含的方式 8.嵌套文件包含 9. 其他预处理指令 10. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 …

微信小程序引入Vant插件

Vant官网&#xff1a;Vant Weapp - 轻量、可靠的小程序 UI 组件库 先查看官网的版本 新建一个package.json页面&#xff0c;代码写上&#xff1a;&#xff08;我先执行的npm安装没出package页面&#xff0c;所以先自己创建了一个才正常&#xff09; {"dependencies"…

【软件测试】--功能测试4-html介绍

1.1 前端三大核心 html:超文本标记语言&#xff0c;由一套标记标签组成 标签&#xff1a; 单标签&#xff1a;<标签名 /> 双标签:<标签名></标签名> 属性&#xff1a;描述某一特征 示例:<a 属性名"属性值"> 1.2 html骨架标签 <!DOC…

web组态软件

1、强大的画面显示web组态功能 2、良好的开放性。 开放性是指组态软件能与多种通信协议互联&#xff0c;支持多种硬件设备&#xff0c;向上能与管理层通信&#xff0c;实现上位机和下位机的双向通信。 3、丰富的功能模块。 web组态提供丰富的控制功能库&#xff0c;满足用户的测…

【数据分享】2019-2023年我国地级市逐月新房房价数据(Excel/Shp格式)

房价是一个城市发展程度的重要体现&#xff0c;一个城市的房价越高通常代表这个城市越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01;之前我们分享过2011-2023年我国地级市逐月二手房房价数据&…

【pytorch】tensor.detach()和tensor.data的区别

文章目录 序言相同点不同点测试实例应用 序言 .detach()和.data都可以用来分离tensor数据&#xff0c;下面进行比较pytorch0.4及之后的版本&#xff0c;.data仍保留&#xff0c;但建议使用.detach() 相同点 x.detach()和x.data返回和x相同数据的tensor&#xff0c;这个新的t…

rpmrebuild 重新制作 rpm

重新制作 rpm 有两种方式 方式一&#xff1a; 1、rpm2cpio xxx.rpm |cpio -idv 2、修改相关文件 3、rpmrebuild -s my.spec xxx.rpm 4、rpmbuild -ba xxx.spec 方式二&#xff1a; 1、rpmrebuild -m /bin/bash -np rpm/xxx.rpm 2、此时我们得到一个交互shell&#xff0c; 3、比…

算法打卡day5|哈希表篇01|Leetcode 242.有效的字母异位词 、19.删除链表的倒数第N个节点、202. 快乐数、1. 两数之和

哈希表基础知识 哈希表 哈希表关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff1b;数组就是哈希表的一种 一般哈希表都是用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在班级里&#xff1a; 要枚举的话时间复杂度是O(n)&…

docker发布dubbo服务 外部程序访问不到问题处理

一、问题简述 程序通过docker向zookeeper注册服务时&#xff0c;会将容器地址(内网地址)作为服务的通信地址。当我们的程序都在容器内相互通信时&#xff0c;可以凭借容器地址相互通信。但是外部程序想要直接通过宿主机取访问服务时&#xff0c;从zk上取到providers的地址&…

【数据结构】从链表到LinkedList类

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…