LeetCode 算法:无重复字符的最长子串c++

原题链接🔗:无重复字符的最长子串
难度:中等⭐️⭐️

题目

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

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

提示
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

题解

滑动窗口法

  1. 题解:使用滑动窗口的方法,通过两个指针表示子串的开始和结束位置,利用哈希表来记录字符的出现情况。

  2. 复杂度:时间复杂度O(N),空间复杂度O(N)。

  3. 代码过程

  • 初始化 start 和 end 指针,分别指向子串的开始和结束。
  • 初始化一个哈希表 charIndexMap 来存储字符及其索引。
  • 初始化maxLength 变量来记录最长子串的长度。
  • 遍历字符串 s:
    • 对于每个字符 s[end]:
      • 如果字符已在 charIndexMap中,并且索引不小于 start:
        • 更新 start 为 charIndexMap[s[end]] + 1。
      • 更新charIndexMap[s[end]] 为当前的 end 索引。
      • 更新 maxLength 为 end - start + 1。
  • 返回maxLength
  1. c++ demo
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> charIndexMap; // 存储字符及其索引
        int maxLength = 0;
        int start = 0; // 窗口的起始位置

        for (int end = 0; end < s.size(); ++end) {
            char currentChar = s[end];
            // 如果字符已存在于哈希表中,且其索引不小于窗口起始位置,则移动窗口起始位置
            if (charIndexMap.find(currentChar) != charIndexMap.end() && charIndexMap[currentChar] >= start) {
                start = charIndexMap[currentChar] + 1;
            }

            // 更新字符的索引
            charIndexMap[currentChar] = end;
            // 更新最长子串的长度
            maxLength = max(maxLength, end - start + 1);
        }

        return maxLength;
    }
};

int main() {
    Solution solution;
    string input = "abcabcbb";
    cout << "The length of the longest substring without repeating characters is: "
        << solution.lengthOfLongestSubstring(input) << endl;
    return 0;
}
  • 输出结果:

The length of the longest substring without repeating characters is: 3
在这里插入图片描述

滑动窗口法

滑动窗口是一种非常有用的算法思想,特别是在处理与字符串、数组或数据流中连续子串或子数组有关的问题时。它的核心思想是通过维护一个可以滑动的窗口来遍历整个数据结构,窗口内的数据满足特定条件。

基本概念

  • 窗口:指的是数据结构(如字符串或数组)中连续的一部分。
  • 滑动窗口:随着遍历的进行,窗口可以向右滑动,即窗口的起始位置和结束位置可以动态变化。

应用场景

滑动窗口常用于解决如下问题:

  1. 最长不重复子串/子数组:找到不包含重复元素的最长连续子串或子数组。
  2. 频率限制:如 LRU 缓存机制,需要维护一个固定大小的窗口,以确定哪些元素应该被移除。
  3. 滑动窗口最大值/最小值:在给定的滑动窗口内找到最大值或最小值。
  4. 区间和/乘积问题:在滑动窗口内计算和或乘积。

算法步骤

  1. 初始化:设置窗口的起始和结束位置,通常起始位置 start 和结束位置 end 都初始化为 0。
  2. 扩展窗口:将 end 指针向右移动,扩展窗口,直到窗口不再满足特定条件(如包含重复字符)。
  3. 收缩窗口:移动 start 指针,使窗口收缩,直到再次满足条件。
  4. 更新答案:在每次窗口调整后,根据问题需求更新答案(如最长长度、最大值等)。
  5. 重复:重复扩展和收缩窗口的过程,直到结束位置 end 到达数据结构的末尾。

示例:

最长不重复子串 以 “无重复字符的最长子串” 问题为例:

  1. 初始化两个指针 startend,指向字符串的起始位置。
  2. 使用哈希表记录窗口内字符的索引。
  3. 扩展窗口:将 end 向右移动,直到遇到重复字符。
  4. 收缩窗口:更新 start 为重复字符的下一个索引,排除重复字符。
  5. 在每次窗口调整后,计算窗口的长度,更新最长子串长度。

总结

滑动窗口是一种高效解决问题的方法,通过动态调整窗口大小来找到满足条件的子串或子数组。它在处理连续性问题时特别有用,并且可以很容易地适应不同的问题需求

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷歌浏览器的平替,内置开挂神器,我已爱不释手!

油猴浏览器正式版是一款基于谷歌Chromium源码开发的浏览器&#xff0c;它集成了集成了强大的油猴扩展&#xff08;Tampermonkey&#xff09;&#xff0c;使得用户可以轻松安装各种脚本&#xff0c;从而增强网页浏览体验。提供了一个更加个性化和高效的浏览体验。 油猴扩展&…

【Python网络爬虫】详解python爬虫中URL资源抓取

&#x1f517; 运行环境&#xff1a;PYTHON &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

CS和msf的权限传递,利用mimikatz抓取win10明文密码

一、Cobaltstrike的安装 http://t.csdnimg.cn/yhZin 安装CobaltStrike&#xff0c;浏览博主的上篇文章即可&#xff01;&#xff01;&#xff01; 这里我在自己的本机win11上执行了Client去连接kali中的Server端&#xff0c;直接执行.cmd文件即可&#xff01;&#xff01;&…

AI智能语音机器人系统如何对接科大讯飞接口

关于AI语音机器人的介绍有很多&#xff0c;但是由于商业化&#xff0c;没有一个能真正说明白的&#xff0c;当然&#xff0c;我们搭建的AI智能机器人系统也是商业化的&#xff0c;毕竟业务是做这方面的&#xff0c;但是价格绝对是公道的&#xff0c;废话不多说了&#xff0c;我…

C++vector及其实现

第一个参数是类型(可以是自定义也可以是内置类型) 相当于生成一个该类型的数组 allocator是空间配置器 遍历 1.下标遍历 2.迭代器遍历 3.范围for 对象访问 有名对象访问 匿名对象访问 隐式类型转换 成员函数 sort 使用sort需要包含头文件algorithm eg. sort的使用非…

QA 未能打开位于 D:/Computer999/Computer999.vbox 的虚拟电脑

前言 未能打开位于 xxx/Computer999.vbox 的虚拟电脑&#xff0c;并提示E_INVALIDARG (0X80070057)&#xff0c;是最常见的一个错误&#xff0c;下面是解决办法。 内容 1、提示下面的错误&#xff0c;注册Computer999失败&#xff1a; 未能打开位于 D:/Computer999/Compute…

【刷题(15】普通数组

一 普通数组基础 首先&#xff0c;我们根据下图先了解一下什么是前缀和。 既然我们明白了前缀和是怎么回事&#xff0c;那我们就来看一下我们该怎么输入 先给出答案&#xff0c;然后再给出分析。 答案&#xff1a; for (int i 1; i < n; i ){cin >> a[i];s[i] s…

JVM之垃圾回收面试总结

文章目录 1.GC概述1.1 什么是垃圾1.2 为什么需要GC&#xff1f;1.3 早期垃圾回收1.4 Java垃圾回收机制1.5 评估GC的性能指标 2.垃圾回收相关算法2.1 垃圾标记阶段的算法2.1.1 引用计数算法(Java没有使用)2.1.2 可达性分析算法 2.2 垃圾清除阶段的算法2.2.1 标记-清除(Mark-Swee…

今在推特发一个推特立马推特账户被删除了

咨询 Google Contacts 是如何 获取我的苹果手机通讯录的电话号码清单的&#xff1f;不到一分钟&#xff0c;我的账户之间被删除了&#xff0c;比停用、冻结还令人可怕。 立马推特账户被删除了。

阿里云搭建物联网平台+MQTT.fx接入阿里云

文章目录 本篇介绍一、阿里云物联网平台搭建二 、MQTT客户端接入阿里云物联网平台总结 本篇介绍 本篇搭建了阿里云物联网平台&#xff0c;使用MQTT.fx接入阿里云&#xff0c;上传温湿度数据 使用到的软件&#xff1a;阿里云、MQTT.fx 一、阿里云物联网平台搭建 首先创建一个物…

Codeforces Round 949 (Div. 2)(A,B题解)

这场真是给我打的汗流浃背了&#xff0c;这场真的巨难&#xff08;可能是因为我二进制根本就没学好的原因吧&#xff09; 反正总共就搞了两道题&#xff0c;第一道题注重于思维&#xff0c;第二道题纯二进制&#xff0c;第三道题看着也是二进制&#xff08;最后时间不够了&…

【Microelectronic Systems】

1 background&introduction 2 analog to Digital Conversion 3 Digital to Anolog Conversion 4 introduction to CMOS outlook ! introduction to semiconductors siemens,西门子 properties of semiconductors types of semiconductors $ PN junction 5 Mathematic s…

Llama(二):Open WebUI作为前端界面,使用本机的llama3

目录 背景 Open WebUI是什么 工程能力特性 产品功能特性 用户体验特性 Open WebUI安装并使用 背景 Mac M1芯片&#xff0c;16G 内存 llama3 8B的部署参考Llama&#xff08;一&#xff09;&#xff1a;Mac M1芯片运行Llama3-CSDN博客在Mac M1 16G内存环境中&#xff0c;…

【数据结构】二叉树的层序遍历~动画超详解

目录 1 什么是层序遍历2 二叉树层序遍历的基本思路3 二叉树层序遍历的实现 1 什么是层序遍历 我们从字面意思就明白,所谓层序,就是一层一层按顺序去遍历一个二叉树,这和我们之前了解的按前中后序遍历方式完全不同 比方说这颗二叉树: 前序遍历: 层序遍历: 2 二叉树层序遍历的…

Zabbix安装:构建高效可靠的Zabbix监控系统

目录 引言 一、zabbix基本介绍 &#xff08;一&#xff09;什么是zabbix &#xff08;二&#xff09;zabbix结构体系 &#xff08;三&#xff09;zabbix监控对象 &#xff08;四&#xff09;zabbix进程 &#xff08;五&#xff09;zabbix监控模式 &#xff08;六&#…

VRTK4教程 二:基本追踪

文章目录 untiyXR和UnityXRPluginFramwork使用方法&#xff1a; TrackedAlias使用方法使用技巧 untiyXR和UnityXRPluginFramwork 这两个用于跟踪头盔位置&#xff0c;其中UnityXR使用的是旧版API&#xff0c;另一个是新版API&#xff0c;两个我我们选一个即可 使用方法&#…

git使用流程

1.下载git 搜索下载 2.注册github账号&#xff08;打开爬墙工具&#xff09; 创建一个仓库 3.配置邮箱和密码 4.所以找一个文件夹 鼠标右键 选择 open Git Bash here&#xff08;当前文件夹下打开命令行&#xff09; 输入命令 配置用户名和邮箱 5.将建的仓库克隆下来 …

鸿蒙Ability Kit(程序框架服务)【UIAbility组件与UI的数据同步】

UIAbility组件与UI的数据同步 基于当前的应用模型&#xff0c;可以通过以下几种方式来实现UIAbility组件与UI之间的数据同步。 [使用EventHub进行数据通信]&#xff1a;在基类Context中提供了EventHub对象&#xff0c;可以通过发布订阅方式来实现事件的传递。在事件传递前&am…

响应式UI组件DevExtreme中文教程 - 工具栏的自适应模式

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

【算法】在?复习一下快速排序?

基本概念 快速排序是一种基于交换的排序算法&#xff0c;该算法利用了分治的思想。 整个算法分为若干轮次进行。在当前轮次中&#xff0c;对于选定的数组范围[left, right]&#xff0c;首先选取一个标志元素pivot&#xff0c;将所有小于pivot的元素移至其左侧&#xff0c;大于…