剑指Offer48.最长不含重复字符的子字符串 C++

news/2024/11/24 13:59:29/

1、题目描述

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

2、VS2019上运行

滑动窗口的方法

#include <iostream>
#include <string>
#include <unordered_set>using namespace std;class Solution {
public:int lengthOfLongestSubstring(string s) {// 哈希集合,记录每个字符是否出现过unordered_set<char> occ;int n = s.size();// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动int rk = -1, ans = 0;// 枚举左指针的位置,初始值隐性地表示为 -1for (int i = 0; i < n; ++i) {if (i != 0) {// 左指针向右移动一格,移除一个字符occ.erase(s[i - 1]);}while (rk + 1 < n && !occ.count(s[rk + 1])) {// 不断地移动右指针occ.insert(s[rk + 1]);//将字符 s[rk + 1] 插入到哈希集合 occ 中。这样做的目的是记录窗口中出现过的字符++rk;}// 第 i 到 rk 个字符是一个极长的无重复字符子串ans = max(ans, rk - i + 1);//比较滑动窗口的大小}return ans;}
};int main() {Solution solution;string s = "abcabcbb";int length = solution.lengthOfLongestSubstring(s);cout << "Length of the longest substring without repeating characters: " << length << endl;return 0;
}

Length of the longest substring without repeating characters: 3

3、解题思路

  • 1.如果 i 不等于 0,即左指针不在初始位置:
  • 2.从哈希集合 occ 中移除左指针所对应的字符(即滑动窗口左边界向右移动一格,移除一个字符)。
  • 3.不断移动右指针 rk,直到滑动窗口中出现重复字符或者右指针到达字符串的末尾:
  • 4.检查右指针所对应的字符 s[rk+1] 是否在哈希集合 occ 中。
  • 5.如果 s[rk+1] 不在集合中,则将 s[rk+1] 插入到集合 occ 中,以记录窗口中出现过的字符。
  • 6.右指针 rk 向右移动一格(++rk)。
  • 7.计算当前滑动窗口的大小(即右指针减去左指针再加上 1),并与更新 ans 的值进行比较,取较大的值作为新的 ans。
  • 8.循环进行下一轮迭代,更新左指针 i,直到遍历完字符串 s 的所有位置。
  • 通过不断移动左指针和右指针,循环遍历了所有可能的滑动窗口,找到了最长的无重复字符子串的长度。

4、count()函数

  • count() 是一种用于确定容器中特定元素出现次数的函数。在 C++ 中,count() 函数通常用于容器类,如字符串、向量、列表、集合等。在这些容器中,count() 函数用于计算指定元素出现的次数。
  • 对于哈希集合 occ,occ.count(s[rk + 1]) 用于计算 s[rk + 1] 在集合 occ 中的出现次数。如果 s[rk + 1] 在集合中存在,则返回 1;如果不存在,则返回 0。
  • 哈希集合是一种不允许重复元素的容器。因此,对于哈希集合来说,count() 函数的返回值只能是 0 或 1。

http://www.ppmy.cn/news/1036941.html

相关文章

Dynamic Web TWAIN Crack,支持向图像添加彩色矩形

Dynamic Web TWAIN Crack,支持向图像添加彩色矩形 Dynamic Web TWAIN用于快速部署 Web 应用程序的文档扫描 SDK&#xff0c;文档扫描SDK&#xff0c;&#xff0c;超过 5300 家公司信任 Dynamic Web TWAIN &#xff0c;因其稳健性和安全性而受到超过 5300 家公司的信赖&#xff…

LiveData简介及使用-什么是LiveData的粘性事件(数据倒灌)?

建议先了解《Lifecycle原理、源码解析》 LiveData是一种具有生命周期感知能力的可观察数据持有类 LiveData可以保证屏幕上的显示内容和数据一直保持同步 特点&#xff1a; 1.LiveData了解UI界面的状态&#xff0c;如果activity不在屏幕上显示&#xff0c;livedata不会触发没…

群晖安装 frpc

群晖安装 frpc 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 写该文章之前&#xff0c; 我尝试过使用 “任务计划” 设置开机启动 frpc&#xff0c; 但是失败了。 最后尝试使用 docker 开机启动 frpc 才成功&#xff0c; 因此本文主要介绍使用 docker …

黑客入侵:福特汽车Sync3车机存在漏洞,黑客入侵可抹除系统数据

据福特汽车公告&#xff0c;他们发现部分2021年至2022年车型的Sync3车机存在Wi-Fi漏洞&#xff0c;该漏洞可能被黑客利用来入侵并抹除车机内的系统数据。这一漏洞源于福特车系中采用的WL18xx MCP驱动程序的内存缓冲区溢位漏洞&#xff0c;其漏洞编号为CVE-2023-29468。 这一发现…

cpu和io的关系

在说io的五中模型之前,先说说Io把文件从哪里移到了哪里 自己的理解: 根据工作或者遇到的业务. 文件不可能存在缓存或在内存中,因为缓存和内存不能永久性储存东西, 文件需要被永久性储存.因此文件都存在电脑的硬盘里, 或者存在云服务器的它们的硬盘里. 我们io文件, 第一…

Java 工具类之JSON key根据ASCII排序

Java按键值字典序排列 参数按照KEY值进行字典序排序(按照KEY值的ASCII码从小到大),并用&作为各参数之间的分隔符将参数拼接成字符串。这里用到了SortedMap&#xff0c;复制以下代码开箱即用~ /*** getSortedString 对参数按照Key进行ASCII排序* param jsonObject 请求参数…

【Java基础】Java对象的生命周期

【Java基础】Java对象的生命周期 一、概述 一个类通过编译器将一个Java文件编译为Class字节码文件&#xff0c;然后通过JVM中的解释器编译成不同操作系统的机器码。虽然操作系统不同&#xff0c;但是基于解释器的虚拟机是相同的。java类的生命周期就是指一个class文件加载到类…

C++——函数重载及底层原理

函数重载的定义 函数重载&#xff1a; 是函数的一种特殊情况&#xff0c;C允许在同一作用域重声明几个功能类似的同名函数&#xff0c;这些同名函数的形参列表&#xff08;参数个数或者类型&#xff0c;类型的顺序&#xff09;不同&#xff0c;常用来处理实现功能类似数据结构…