3. Longest Substring Without Repeating Characters (无重复字符的最长子串)滑动窗口

news/2024/4/29 1:33:03/文章来源:https://blog.csdn.net/m0_73132141/article/details/127518850

文章目录

  • 问题
    • 英文
    • 中文
  • 代码
    • 小白的码
    • 大佬的码
  • 知识点
    • unordered_set 容器具有以下几个特性:
  • 总结

问题

英文

3. Longest Substring Without Repeating Characters
(无重复字符的最长子串)

在这里插入图片描述
在这里插入图片描述

中文

在这里插入图片描述

代码

小白的码

#include <iostream>
#include <string>
#include <cstring>
using namespace std;class SolutionAC {
public:int lengthOfLongestSubstring(string s){if (s == "")return 0;char sSubC[50010];int arr[130]; // 统计滑动窗口中字符出现是否超过2int memsize = sizeof(int) * 130;memset(arr, 0, memsize);int ssize = s.size();int index = 0;int len = 1;int lentmp;// int flag = 0; // 作为标记,用来标记是否需要减去多加的。(当前值已经开始重复了,但是被计算在 lentmp中,进而混进了len中int i;for (i = 0; i < ssize; i++){arr[s[i]]++;if (arr[s[i]] > 1){lentmp = i - index; // 每次到临界点时,统计一下最大lentmp,再和len比较if (lentmp > len) len = lentmp;while (arr[s[i]] > 1) // 调整窗口,直到不含重复字符{index++;arr[s[index - 1]]--;}}}lentmp = i - index; // 最后一次统计的lentmp(针对abcdeg.....)if (lentmp > len) len = lentmp;return len;}
};class SolutionTimeLimitExceeded // 遍历,超时
{
public:int lengthOfLongestSubstring(string s){if (s == "")return 0;int arr[130];int len = 1;// int subSize;int a;int flag;char sSubC[50010]; // 用个字符数组来存子串int ssize = s.size();int memsize = sizeof(int) * 130;// int eor = 0;for (int i = 0; i < ssize; i++){for (int j = len + 1; j <= ssize - i; j++){// cout << s.substr(i, j) << endl;memset(arr, 0, memsize);strcpy(sSubC, s.substr(i, j).c_str()); // c_strflag = 1; // 没有重复字符// subSize = sSubC.size();for (int k = 0; k < j; k++){a = sSubC[k];arr[a]++;if (arr[a] > 1){flag = 0;// cout <<"a = " <<  a << " " << arr[a] << endl;break;}}if (flag == 1){len = j;}}}return len;}
};int main()
{string str;Solution sol;cin >> str;cout << sol.lengthOfLongestSubstring(str) << endl;return 0;
}

大佬的码

class Solution {
public:int lengthOfLongestSubstring(string s) {// 哈希集合,记录每个字符是否出现过unordered_set<char> occ; // occurence 出现int n = s.size();// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动int righPtr = -1, ans = 0;// 枚举右指针的位置,初始值隐性地表示为 -1for (int i = 0; i < n; ++i) {if (i != 0) {// 指针向右移动一格,移除一个字符(尝试移除重复的字符,直到删除为止,不然进不去下面的 while循环)occ.erase(s[i - 1]);}while (righPtr + 1 < n && !occ.count(s[righPtr + 1])) { // 当哈希集合没有当点指针所指的字符时// 不断地移动右指针occ.insert(s[righPtr + 1]);++righPtr;}// 第 i 到 righPtr 个字符是一个无重复字符的子串ans = max(ans, righPtr + 1 -i);}return ans;}
};

知识点

unordered_set 容器具有以下几个特性:

不再以键值对的形式存储数据,而是直接存储数据的值;
容器内部存储的各个元素的值都互不相等,且不能被修改。
不会对内部存储的数据进行排序
(这和该容器底层采用哈希表结构存储数据有关,

template < class Key,  class Hash = hash<Key>,  class Pred = equal_to<Key>,  class Alloc = allocator<Key> > class unordered_set;  
C++ 11中对unordered_set描述大体如下:
无序集合容器(unordered_set)是一个存储唯一
(unique,即无重复)的关联容器(Associative container),
容器中的元素无特别的秩序关系,该容器允许基于值的快速元素检索,
同时也支持正向迭代。
在一个unordered_set内部,元素不会按任何顺序排序,
而是通过元素值的hash值将元素分组放置到各个槽(Bucker,也可以译为“桶”),
这样就能通过元素值快速访问各个对应的元素(均摊耗时为O(1))。
原型中的Key代表要存储的类型,
而hash<Key>也就是你的hash函数,
equal_to<Key>用来判断两个元素是否相等,
allocator<Key>是内存的分配策略。

我们就可以使用「滑动窗口」来解决这个问题:
我们使用两个指针表示字符串中的某个子串(或窗口)的左右边界,
其中左指针代表着「枚举子串的起始位置」,而右指针即为用来向右移动到下一项

在每一步的操作中,当我们将左指针向右移动一格,表示
我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,
但需要保证这两个指针对应的子串中没有重复的字符。
在移动结束后,这个子串就对应着
以左指针开始的,不包含重复字符的最长子串。我们记录下这个子串的长度;
在枚举结束后,我们找到的最长的子串的长度即为答案。

总结

多思考,多动手,多学习!感受生活的充实!
在这里插入图片描述
我是用的滑动窗口的思路,代码实现是用 一个含130个整型值的数组对应字符的ASCII 码,来统计字串中是否出现重复的字符,更简单一些!!!
思路大体一致,很明显,自己还有很多很多提升改进的地方!!路漫漫!!!

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

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

相关文章

Terraform 基础 申请阿里云资源

之前&#xff0c;资源都定义好了&#xff0c;现在就是去申请资源了。 申请这些资源就需要使用terraform的命令行了&#xff0c;开始初始化后端&#xff0c;后端是有存储文件的&#xff0c;默认情况下是在本地存储的&#xff0c;然后会多一些文件。 &#xff08;下载插件&#x…

在python中安装gensim包(为了使用LDA)

LDA是英文“Latent Dirichlet Allocation”的缩写&#xff0c;意思是隐含狄利克雷分布&#xff0c;是一种主题模型&#xff08;topic model&#xff09;&#xff0c;它可以将文档集中每篇文档的主题以概率分布的形式给出。 gensim包中有LDA的一种实现。 本文介绍gensim包的安…

神经网络中的算法-梯度下降算法

目录 一、概述 二、算法思想 1、一维 2、多维 三、梯度下降类型 1、批量梯度下降算法 2、随机梯度下降算法 3、小批量梯度下降算法 一、概述 梯度下降法&#xff08;Gradient descent &#xff09;是一个一阶最优化算法&#xff0c;通常也称为最陡下降法 &am…

NetworkManager nmcli ipv4 静态ip 笔记221025

nmcli connection modify 可以修改现有连接 con 可以写成 c 到 connection 之间的字段mod 可以写成 m 到 modify 之间的字段nmcli connection modify nmcli connec modify nmcli conne modif nmcii conn modi nmcli con mod nmcli co mo nmcli c m nmcli c modify nmcli conne…

购物中心智能管理系统该如何选择

快鲸智慧楼宇系统作为新一代数智化商管系统&#xff0c;以实际业务场景出发构建产品逻辑&#xff0c;并在传统商管系统基础上&#xff0c;拥有独家的商业大数据加持&#xff0c;同时嵌入了BI智能分析工具&#xff0c;打造了一个招商营运场景的数智化系统&#xff0c;将“人的经…

[C++] 初接触 泛型编程—— C++ 模板分析

泛型编程 C中引入了重载的概念&#xff0c;使得可以编写多个函数名相同但参数、返回值不同的函数&#xff0c;例如&#xff1a; 相同的函数名可以传入不同的参宿&#xff0c;进而调用不同的函数 但&#xff0c;即使有了重载&#xff0c;相同功能的函数 还要分别对不同的类型进…

Python之numpy数组篇(下)

目录 一、数组排序 1、概念 2、升序&#xff0c;最大、最小值 3、原地、横向排序 二、数组内积运算 1、概念 2、代码例子 三、访问数组元素 1、使用介绍 2、行列直接访问 3、切片 4、行列访问扩展 四、数组对函数运算的支持 1、概念 2、例子 五、改变数组形状 1…

1.3.3系统调用

文章目录为什么引入系统调用什么是系统调用系统调用和库函数的区别系统调用的背后为什么引入系统调用 为了防止这样情况的发生&#xff0c;就是防止进程能够随意的去调用我们的系统资源&#xff0c;操作系统提供了系统调用的功能&#xff0c;用户进程想要使用打印机这种共享资源…

12_Vue事件总结

事件总结 事件修饰符连携 准备工作 html <!-- 定义一个容器 --><div class="app"><!-- 事件修饰符连携 --><div class="box" @click="toBaidu"><a href="https://www.baidu.com" @click.stop="toBaid…

Java代码审计前置知识——SpringMVC基础

目录 (一&#xff09;回顾MVC 1.1 什么是MVC Model&#xff08;模型&#xff09; View&#xff08;视图&#xff09; Controller&#xff08;控制器&#xff09; 1.2 Model1时代 1.3 Model2时代 总结 1.4 回顾Servlet 0x01 新建一个Maven工程当做父工程,pom依赖 0x0…

1.1.2操作系统的特征

操作系统是一个系统软件&#xff0c;但与其他系统软件和应用软件有很大的不同&#xff0c;就是它拥有自己的特殊性&#xff0c;及基本特征 首先共享和并发是相互存在的条件共享和并发是虚拟和异步的前提&#xff0c;是操作系统的两个最基本的特征 1并发 拿餐厅吃饭举例子&…

3.3.3JavaScript网页编程——WebAPI(JS之BOM含正则)

目录BOMwindow对象定时器-延时函数setTimeoutJS执行机制&#xff08;执行栈、任务队列&#xff09;面试要问location对象location.href (获取完整url或者赋值)location.search (获取?后面的)location.hash(获取#号后面的)location.reloadnavigator对象&#xff08;检测浏览器移…

10_事件处理阶段

v-on指令 语法 v-on:xxx 这里的xxx指代的是各类事件类型,例如单击,双击,鼠标悬停,键盘监听等等...... 准备工作 准备一个容器,两个按钮,一个按钮不传递参数,另一个按钮传递参数 <body><!-- 创建一个容器 --><div class="subject"><!-- 标…

having where的区别,SQL70 返回更多的产品

返回更多的产品_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/dc91b7d2de3c4603a55995e83210f605?tpId298&tqId2368029&ru/exam/oj&qru/ta/sql-teach-yourself/question-ranking&sourceUrl%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25A…

MMSegmentation V0.27.0训练与推理自己的数据集(二)

1、官方模型转换MMSegmentation风格 如果你想自己转换关键字使用官方存储库的预训练模型&#xff0c;我们还提供了一个脚本swin2mmseg.py在tools directory &#xff0c;将模型的关键字从官方的repo转换为MMSegmentation风格。 python tools/model_converters/swin2mmseg.py …

一篇文章带你了解服务器操作系统——Linux简单入门

一篇文章带你了解服务器操作系统——Linux简单入门 Linux作为服务器的常用操作系统,身为工作人员自然是要有所了解的 在本篇中我们会简单介绍Linux的特点,安装,相关指令使用以及内部程序的安装等本篇内容属于《瑞吉外卖》的知识科普部分,有兴趣可以查看一下《瑞吉外卖》的相…

欧拉路径(欧拉环游、欧拉回路)

一个流行的游戏是用铅笔画这些图&#xff0c;但是图中的每一条边都只能被画一次&#xff0c;在画图过程中铅笔不能离开纸面。难度更高的问题是&#xff0c;不光要一笔画完图&#xff0c;并且起点和终点还要落在同一处。如果我们将上面的三个图形都看作图数据结构&#xff0c;那…

flash动画设计并发布、嵌入到网页

【创意内容】 Flash动画设计,二维动画自己选择了动画主题,有三个板块:bubbles动画、蝴蝶飞动画、全球游线图动画,都是自己做的,使用了场景运用动画、图片的滚动、形状遮罩等功能。 【程序运行截图】 bubbles butterflies global

ICCV 2021 | Y-Net:轨迹-场景信息的真正融合

今天没有多余的解释&#xff0c;直接开始吧~ 1. Y-Net网络结构 Y-Net的网络结构长什么样子呢&#xff1f;Y-Net的网络结构就长下图这样子。看上去我好像在自言自语&#xff0c;其实你仔细揣摩就会发现&#xff0c;我真的是在自言自语。可以看到说&#xff0c;Y-Net网络输入的是…

TPH-YOLOv5: 基于Transformer预测头的改进YOLOv5用于无人机捕获场景目标检测

代码链接&#xff1a;GitHub - cv516Buaa/tph-yolov5 这是一篇针对无人机小目标算法比赛后写的论文&#xff0c;无人机捕获场景下的目标检测是近年来的热门课题。由于无人机总是在不同的高度上飞行&#xff0c;目标尺度变化剧烈&#xff0c;给网络优化带来了负担。此外&#xf…