算法题打卡力扣第3题:无重复字符的最长子串(mid)

文章目录

    • 题目描述
    • 解法一:暴力解
    • 解法二:滑动窗口

题目描述

在这里插入图片描述

解法一:暴力解

遍历每一个可能的子串,然后逐一判断每个子串中是否有重复字符。

具体步骤:

  • 使用两层嵌套循环来生成所有子串的起止位置:
    外层循环 i 从 0 到 n-1 (起始位置)。
    内层循环 j 从 i 到 n-1 (结束位置)。
  • 对于每一个子串 s.substring(i, j+1),我们再设计一个辅助函数 hasDuplicate(substring) 来检查这个子串中是否存在重复字符。
  • 检查 hasDuplicate 通常需要使用一个哈希集合 (Set):遍历子串的每个字符,尝试加入 Set。如果某个字符加入失败(因为 Set 中已存在),则说明有重复。
  • 如果没有重复,我们就用 j - i + 1 来更新记录的最大长度 max_len。

实现代码

#include <unordered_set> // 用于哈希集合
#include <algorithm>     // 用于 std::max
class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.length();int max_len = 0;for(int i=0;i<n;++i){for(int j=i;j<n;++j){std::string substring = s.substr(i,j-i+1);if(!hasDuplicate(substring)){max_len = std::max(max_len,(int)substring.length());}}}return max_len;}bool hasDuplicate(const std::string&s){std::unordered_set<char> seen_characters;for(char c : s){if(!seen_characters.insert(c).second){return true;}}return false;}
};

执行结果
超出时间范围了
在这里插入图片描述

复杂度分析
时间:O(n^3)
空间:O(n)

解法二:滑动窗口

我们维护一个窗口 [start, end],它始终代表一个不包含重复字符的子串。我们不断尝试扩大这个窗口的右边界end。如果在这个过程中,新加入的字符导致了窗口内出现重复,我们就需要收缩窗口的左边界 start,直到窗口内不再有重复字符为止。

如何快速判断字符是否重复以及其位置?
我们需要一个数据结构来高效地完成两件事:
判断一个字符是否已经在当前窗口中。
如果存在,找出它上次出现的位置。
哈希映射 (Map) 或数组是完美的选择。
哈希映射 Map<Character, Integer>:键 (Key) 存储字符,值 (Value) 存储该字符的最新索引。
数组 int[128]:如果字符集是 ASCII,我们可以用一个大小为 128 的数组来模拟哈希映射,数组的索引是字符的 ASCII 码,值是该字符的最新索引。这比哈希映射更快。

具体步骤 (以哈希映射为例):
初始化两个指针:start = 0 (窗口左边界),end = 0 (窗口右边界)。
初始化 max_len = 0 (记录最大长度)。
初始化一个哈希映射 map,用于存储窗口内字符及其最新索引。
使用 end 指针作为主循环,从 0 遍历到 n-1:
a. 获取当前右边界的字符 char_end = s[end]。
b. 检查 char_end 是否导致重复:
i. 在 map 中查找 char_end。
ii. 如果 char_end 已经在 map 中存在,并且它上次出现的位置 map.get(char_end) 在当前窗口内(即 map.get(char_end) >= start),这说明我们遇到了一个重复字符。
iii. 为了消除这个重复,我们需要将窗口的左边界 start 跳跃到重复字符的下一个位置。即 start = map.get(char_end) + 1。
c. 更新 map:无论是否重复,我们都需要更新 char_end 在 map 中的位置为当前的 end 索引。map.put(char_end, end)。
d. 更新 max_len:在每一步之后,当前有效的无重复子串的长度就是 end - start + 1。我们用它来更新 max_len。 max_len = max(max_len, end - start + 1)。
e. end 指针自增,考察下一个字符。
循环结束后,max_len 就是最终答案。
实现代码


class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.length();if(n==0){return 0;}std::unordered_map<char,int> char_map;int max_len = 0;int start = 0;for(int end = 0;end<n;++end){char current_char = s[end];if(char_map.count(current_char)&&char_map[current_char] >= start){start = char_map[current_char] + 1;}char_map[current_char] = end;max_len = std::max(max_len,end-start+1);}return max_len;}};

执行结果
在这里插入图片描述

复杂度分析
时间:O
空间:O

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

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

相关文章

HTML5 简介和基础骨架

一、HTML5 简介HTML5 是 HTML&#xff08;超文本标记语言&#xff09;的第五个主要版本&#xff0c;于 2014 年 10 月由 W3C&#xff08;万维网联盟&#xff09;正式发布。它不仅是对 HTML4.01 和 XHTML 的升级&#xff0c;更是一套完整的 Web 技术标准&#xff0c;包含了新的标…

.NET技术深度解析:现代企业级开发指南

每日激励&#xff1a; “不要一直责怪过去的自己&#xff0c;他曾经站在雾里也很迷茫” &#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1…

苹果手机文本转音频,自行制作背诵素材

当你在学习一段专业内容或者背诵重要知识点时&#xff0c;是不是有时会觉得眼睛看久了疲惫&#xff0c;而且记忆效果也不太理想呢&#xff1f;利用手头的苹果手机或iPad&#xff0c;你可以轻松将文本内容生成音频文件&#xff0c;然后随时随地反复听&#xff0c;这对于备考人士…

电子电子技术知识------MOSFET管

电子电子技术知识------MOSFET管前言一、结构与符号二、工作原理1.小功率MOSFET&#xff08;横向导电&#xff09;2.电力MOS管三、基本特性总结前言 MOSFET是电力场效应晶体管的英文简写&#xff0c;又称功率mos管&#xff0c;mos管 一、结构与符号 二、工作原理 1.小功率M…

仿真波导中超短脉冲传输中的各种非线性效应所产生的超连续谱

在波导中&#xff0c;超短脉冲传输时会受到各种非线性效应的影响&#xff0c;从而产生超连续谱。这些非线性效应包括自相位调制&#xff08;SPM&#xff09;、交叉相位调制&#xff08;XPM&#xff09;、四波混频&#xff08;FWM&#xff09;等。基于MATLAB的仿真程序&#xff…

docker-compose的使用

目录 1-查看容器 2-查看docker镜像 3-运行两个容器 4-进入idea 编写docker-compose文件中的内容 5-编写配置文件 6-运行 7-docker-compose中的一些命令 启动服务 关闭服务 查看正在运行的容器 查看日志 重构新的服务 指令docker-compose 文件名 停止已运行的服务 启动 重启 1-查…

搭建分布式Hadoop集群[2025] 实战笔记

文章目录 一、实战目标 二、集群规划 1. 集群拓扑结构 2. 角色分配 说明: 三、环境准备 1. 修改 SSH 端口(安全加固) 操作步骤(所有节点执行): 2. FinalShell 连接配置 3. 防火墙配置 启动并配置 firewalld: 关闭并禁用防火墙(生产环境建议精细配置,测试环境可关闭):…

【自记录】Ubuntu20.04下Python自编译

因为需要新的Python版本&#xff0c;但是我们不希望修改系统原生的Python版本避免某些系统应用无法启动&#xff0c;因此自建一个干净的路径引入Python。 1.编译 以下在aarch64下测试&#xff0c;x64下可能有差异 必须把相关的devel包安装完毕&#xff0c;否则python可能缺功能…

Linux - 进程切换

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录进…

机器算法(五)模型选择与调优

一 交叉验证1 保留交叉验证HoldOutholdOut Cross-validation(Train-Test Split)在这种交叉验证技术中&#xff0c;整个技术集被随机划分为训练集和验证集。根据经验法则&#xff0c;整个数据集的近70%被用作训练集&#xff0c;其余30%被用作验证集&#xff0c;也就是最常使用的…

Ubuntu 服务器实战:Docker 部署 Nextcloud+ZeroTier,打造可远程访问的个人云

本次部署基于 Ubuntu 系统&#xff08;桌面版 / Server 版通用&#xff0c;核心操作一致&#xff09;&#xff0c;硬件配置参考如下&#xff0c;低配置主机可顺畅运行&#xff1a; ubuntu服务器配置如下 硬件类型具体型号/参数CPUIntel Core i3-6100T内存条8GB&#xff08;DD…

移动硬盘删除东西后,没有释放空间

请按照以下步骤&#xff0c;从最简单、最常见的原因开始排查和解决&#xff1a;主要原因和解决方案1. 检查操作系统回收站 (最常见原因&#xff01;)这是最容易被忽略的一点。当您直接在外接移动硬盘上删除文件时&#xff0c;文件并不会直接消失&#xff0c;而是被移到了该移动…

spring boot驴友结伴游网站的设计与实现(代码+数据库+LW)

摘要 本文介绍了基于Spring Boot框架开发的驴友结伴游网站的设计与实现。该网站旨在为旅行爱好者提供一个便捷的平台&#xff0c;使他们能够轻松地寻找伙伴、预定酒店、参与活动以及分享旅行经历。系统主要分为两大模块&#xff1a;用户模块和管理员模块。用户可以通过注册账号…

人机之间的强交互与弱交互

人机交互不是简单的人机&#xff0c;其本质是人机环境系统的交互。在这个系统中&#xff0c;人和机器不是孤立的存在&#xff0c;而是在特定环境下相互影响、相互作用的一部分。人机之间的强交互与弱交互可以从以下几个方面来理解&#xff1a;1、人机强交互通常是指人与机器之间…

OpenCV 基础知识总结

学习网站 https://zhuanlan.zhihu.com/p/483604320 命名空间 using namespace cv; Mat 作用 创建图像&#xff08;矩阵&#xff09; 格式 Mat image; //创建一个空图像image&#xff0c;大小为0 Mat image(100,100,CV_8U); //指定矩阵大小&#xff08;矩阵行数/列数&#xff09…

C#基础(⑦user32.dll)

我们来详细学习如何使用 user32.dll&#xff0c;它是 Windows 系统中负责用户界面交互的核心 DLL&#xff0c;包含窗口管理、消息处理、键盘鼠标输入等功能。下面从基础到进阶&#xff0c;一步一步教你调用其中的常用函数。在 C# 中调用 user32.dll 需要使用 DllImport 特性&am…

Markdown格式.md文件的编辑预览使用

推荐工具Visual Studio Code (VS Code) - 强烈推荐特点&#xff1a;微软出品&#xff0c;免费、开源、跨平台&#xff08;Windows, macOS, Linux&#xff09;。拥有海量插件市场。编辑体验&#xff1a;安装 Markdown All in One 等插件后&#xff0c;可以获得语法高亮、实时预览…

TypeScript:unknown 类型

作为前端开发工程师&#xff0c;在 TypeScript 中使用 unknown 类型是提升类型安全的关键实践。下面我会结合实际开发场景详细讲解其特性和价值。unknown 核心特性1.类型安全的顶级类型与 any 类似&#xff0c;可接受任何类型的赋值&#xff1a;let userInput: unknown; userIn…

2025 批量下载hasmart所有知乎回答,文章和想法,导出txt,html和pdf

之前分享过文章2025 一键批量下载备份知乎回答/文章/想法/专栏/视频/收藏夹&#xff0c;导出txt&#xff0c;html和 pdf &#xff0c;今天继续下载hasmart这个号的所有知乎回答 下载的知乎回答目录&#xff0c;包含发布时间和标题&#xff0c;点击可跳转对应回答。 2019年发布…

mapbox高阶,结合threejs(threebox)添加管道,实现管道流动效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️threebox add加载网格对象 二、🍀…