leetcode 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度 哈希集合unordered_set C++

news/2024/11/15 19:44:39/

给定一个字符串 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 由英文字母、数字、符号和空格组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

答案解析

答案来源于官网,这里面加的代码是用来测试代答案,我这里只是分析代码实现的逻辑。

代码主要由哈希集合实现,所以先讲一下其基本用法
哈希集合unordered_set用法
必须包含相关的头文件

#include <unordered_set>

定义

unordered_set<type> hashset

用法

hashset.erase(type a)删除集合里面a的元素

例:
hashset 数据为 {‘a’,‘b’,‘c’}
hashset.erase(‘a’) 结果就变为 {‘b’,‘c’}

hashset.insert(type a)将a元素插入到集合中

例:
hashset.insert(‘t’)结果就变为{‘b’,‘c’,‘t’}

hashset.count('b')统计’b’这个元素在集合中的个数

流程分析:

  • 字符串s长度n作为循环总次数,i 为当前循环次数
  • 若i!=0,则哈希集合找到字符串第i位的s[i]值,并删除
  • 如果哈希集合中没有与将要插入的新的s[rk+1]的值相等的值,则将其入插入到哈希集合中。
  • 若相等,则不插入。并计算此时哈希集合的长度,取最大的长度保存
  • 返回第一步,直到循环结束

#include <iostream>
#include <unordered_set>
using namespace std;class Solution {
public:int lengthOfLongestSubstring(string s) {// 哈希集合,记录每个字符是否出现过unordered_set<char> occ;int n = s.size();cout<<"s size:"<<n<<endl;// 右指针,初始值为 -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])) {auto flag = occ.count(s[rk + 1]);auto a = rk+1;// 不断地移动右指针cout<<"insert count: "<<rk+1<<"   insert s: "<<s[rk+1]<<endl;occ.insert(s[rk + 1]);++rk;cout<<"rk:"<<rk<<endl;}// 第 i 到 rk 个字符是一个极长的无重复字符子串auto flag = occ.count(s[rk + 1]);cerr<<"occ count: "<<flag<<" rk:"<<rk<<" i: "<<i<<endl;ans = max(ans, rk - i + 1);cerr<<"ans:"<<ans<<endl;}return ans;}
};int main(){Solution S;string s = "abdegdgddads";S.lengthOfLongestSubstring(s);return 0;
}

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

相关文章

Hadoop Streaming使用简介

一、Hadoop Streaming 它是hadoop的一个工具&#xff0c;用来创建和运行一类特殊的map/reduce作业。所谓的特殊的map/reduce作业可以是可执行文件或脚本本件&#xff08;python、PHP、c等&#xff09;。Streaming使用“标准输入”和“标准输出”与我们编写的Map和Reduce进行数据…

离婚时才知道丈夫年入300万,丈夫藏的是真够深的

据媒体报道&#xff0c;近日&#xff0c;江苏宜兴法院公开了一起离婚案件&#xff0c;引起了社会广泛关注。 这起案件的争议点在于夫妻共同财产的分割问题。 据报道&#xff0c;丈夫李某在离婚案中声称自己仅有10万元存款&#xff0c;而妻子张某则是家庭主妇&#xff0c;对丈夫…

Go 语言 map 是并发安全的吗?

原文链接&#xff1a; Go 语言 map 是并发安全的吗&#xff1f; Go 语言中的 map 是一个非常常用的数据结构&#xff0c;它允许我们快速地存储和检索键值对。然而&#xff0c;在并发场景下使用 map 时&#xff0c;还是有一些问题需要注意的。 本文将探讨 Go 语言中的 map 是否…

跨境电商环境搭建和买家账号培养的关键考虑因素

作为跨境电商环境搭建和买家账号培养的专业技术开发人员&#xff0c;我深知在亚马逊、速卖通、阿里国际、速卖通、美客多、shopee、Lazada、ebay、Temu等平台上运营的卖家面临的挑战 其中&#xff0c;补单是一项关键的工作&#xff0c;它能帮助卖家增加商品列表和评价数量&…

Day53【动态规划】1143.最长公共子序列、1035.不相交的线、53.最大子序和

1143.最长公共子序列 力扣题目链接/文章讲解 视频讲解 本题最大的难点还是定义 dp 数组 本题和718.最长重复子数组区别在于这里不要求是连续的了&#xff0c;但要有相对顺序 直接动态规划五部曲&#xff01; 1、确定 dp 数组下标及值含义 dp[i][j]&#xff1a;取 text1…

纯js实现在线文字识别,从图片中提取文本信息

当你需要将图片中的文字内容提取出来时&#xff0c;你可能想到了手动输入或者使用OCR技术。而当你需要进行在线文字识别时&#xff0c;一个纯JavaScript实现的OCR工具可能会成为你的优选方案。 纯JavaScript&#xff0c;使得在浏览器内部进行文字识别变得可能。 此外&#x…

python+vue空巢老人网上药店购药系统9h2k5

本空巢老人购药系统主要包括三大功能模块&#xff0c;即用户功能模块、家属功能模块和管理员功能模块。 &#xff08;1&#xff09;管理员模块&#xff1a;系统中的核心用户是管理员&#xff0c;管理员登录后&#xff0c;通过管理员功能来管理后台系统。主要功能有&#xff1a;…

Net跨平台UI框架Avalonia入门-DataGrid的使用

Avalonia中的DataGrid的使用 DataGrid 数据表格是客户端UI中很重要的一个控件&#xff0c;Avalonia中的DataGrid是单独一个包Avalonia.Controls.DataGrid&#xff0c;要使用DataGrid&#xff0c;需要另外在Nuget中按这个包&#xff0c;下面介绍一下DataGrid的安装和使用 Data…