[C++] 在连续统上的重复性质:滑动窗口
3.无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4:
输入: s = “”
输出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
一开始我的代码
class Solution {public:int lengthOfLongestSubstring(string s) {int maxLength = 0;function <int(string::iterator)> getLength = [&](string::iterator iter_curr){set<int> charCache;for(; iter_curr < s.end(); ++iter_curr){if(charCache.find(*iter_curr) == charCache.end())charCache.insert(*iter_curr);elsereturn charCache.size();}return charCache.size();};for(auto iter = s.begin(); iter < s.end(); ++iter){int lengthCache = getLength(iter);if(maxLength < lengthCache)maxLength = lengthCache;}return maxLength;}
};
暴力解法,太费时间了
看了题解,可以使用滑动窗口
滑动窗口是需要长度变化有一定规律的
最长子串刚好有一个特点是,从一个位置开始的子串和从另一个位置开始的子串之间是有互相重叠的部分的,这个重叠的部分就是,最耗时间的,因为如果每一次选定子串头开始找最长子串都要从 0 开始找,那么就相当于把这个重复的部分找了很多次。
那么现在就是知道了,我不想找重复的部分,但是我怎么实现呢
就是,用两个指针,记录下子串结束的位置,每一次移动左指针的时候,右指针不动,这个不动代表着,默认现在左右指针之间的部分就是符合要求的,即字符不重复的,然后左指针这一次移动好了之后,我就继续尝试移动右指针,直到右指针不能动了为止,才让左指针再继续移动,然后重复下一轮的右指针移动检查;什么时候右指针不能动呢,就是发现要移动到的位置与已有的字串中重复了
我一开始还这样写
class Solution {public:int lengthOfLongestSubstring(string s) {string::iterator iterL;string::iterator iterR;set<int> charCache;int maxLength = 0;int lengthCache = 0;for(iterL = s.begin(), iterR = s.begin(); iterL < s.end(); ){// 初始化if(iterR == s.begin())charCache.insert(*iterR);// 右指针移动while(true){++iterR;if(iterR >= s.end())break;if(charCache.find(*iterR) == charCache.end())charCache.insert(*iterR);elsebreak;}// 记录长度,取最大值lengthCache = charCache.size();maxLength = max(maxLength,lengthCache);charCache.erase(*iterL);++iterL;}return maxLength;}
};
错就错在 iterR 指向的元素如果在检查的时候没有加入 set 的话,在下一次 iterL 移动之后,再次检查 iterR 时,就会跳过这个指向的元素,直接检查下一个
于是我改成了
class Solution {public:int lengthOfLongestSubstring(string s) {string::iterator iterL;string::iterator iterR;set<int> charCache;int maxLength = 0;int lengthCache = 0;for(iterL = s.begin(), iterR = s.begin(); iterL < s.end(); ){// 初始化if(iterR == s.begin())charCache.insert(*iterR);// 右指针移动while(true){++iterR;if(iterR >= s.end())break;if(charCache.find(*iterR) == charCache.end())charCache.insert(*iterR);else{--iterR;break;}}// 记录长度,取最大值lengthCache = charCache.size();maxLength = max(maxLength,lengthCache);charCache.erase(*iterL);++iterL;}return maxLength;}
};
但是还是有错
再改了一下,因为感觉在循环里面先递增右指针不太好
class Solution {public:int lengthOfLongestSubstring(string s) {string::iterator iterL;string::iterator iterR;set<int> charCache;int maxLength = 0;int lengthCache = 0;for(iterL = s.begin(), iterR = s.begin(); iterL < s.end(); ){// 初始化if(iterR == s.begin())charCache.insert(*iterR);// 右指针移动while(true){if(iterR + 1 >= s.end())break;if(charCache.find(*(iterR + 1)) == charCache.end()){++iterR;charCache.insert(*iterR);}else{break;}}// 记录长度,取最大值lengthCache = charCache.size();maxLength = max(maxLength,lengthCache);charCache.erase(*iterL);++iterL;if(int(iterL - iterR) > 0){iterR = iterL;charCache.insert(*iterR);}}return maxLength;}
};
[C++] 在连续统上的重复性质:滑动窗口相关推荐
- 滑动窗口算法精讲(Sliding Window Algorithm)
文章目录 滑动窗口算法精讲(Sliding Window Algorithm) 简介 步骤及算法模板 模板1 模板2 leetcode例题讲解 入门级 209. 长度最小的子数组 思路: 代码实现 2 ...
- C++ 双指针汇总(快慢指针, 滑动窗口, 前后指针,左右指针)
一. 归并有序序列 LeetCode 88题 input: nums1 = {2,2,3,0,0,0}; m=3; nums2 = {1,5,6}; n=3 output: nums1 = {1,2, ...
- 滑动窗口 [搬运工、版权侵删]
HashMap Java HashMap | 菜鸟教程 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 实现了 Map 接口,根据键的 HashCode ...
- Python数据结构与算法篇(四)-- 滑动窗口算法
数组和链表代表着计算机最基本的两种存储形式:顺序存储和链式存储,所以他俩可以算是最基本的数据结构.数组是一种基础数据结构,可以用来处理常见的排序和二分搜索问题,典型的处理技巧包括双指针.滑动窗口等,数 ...
- 【计算机网络】TCP协议经典十五连问(半连接、重传、滑动窗口、流量窗口、拥塞控制、SYN Flood攻击、粘包拆包)
文章目录 1. 讲下TCP三次握手流程 2.TCP握手为什么是三次,不能是两次?不能是四次? 2.1 为什么握手不能是两次呢? 2.2 为什么握手不能是四次呢? 3. 讲下TCP四次挥手过程 4. T ...
- 滑动窗口算法用法及实题详解
在力扣常用解题法中,我们常常会看到这些: 滑动窗口 双指针 快慢指针/ 链表题目 原地链表翻转 区间合并 无序限定范围的数组元素查找O(N) BFS 树的DFS DFS/递归/回溯法 双堆模式 2分变 ...
- 网络通信-滑动窗口协议-SWP
本篇主要讲解:网络通信-滑动窗口协议-SWP 参考链接1 参考链接2 参考链接3 目录 文章目录 网络通信-滑动窗口协议-SWP TCP可靠传输 窗口介绍 窗口和缓存的关系 功能作用 窗口大小 工作原 ...
- 滑动窗口:给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
一.问题描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 注意: 字符串长度 和 k ...
- 【LeetCode】无重复字符的最长子串【滑动窗口法】
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
最新文章
- linux 查看主板sn_如何使用您的工业边缘计算单元:第三章:使用你的JayBox 主板...
- python 进程理论基础
- 目标检测--Spatial pyramid pooling in deep convolutional networks for visual recognition(PAMI, 2015)
- python元编程之使用动态属性实现定制类--特殊方法__setattr__,__getattribute__篇
- MySQL 多表查询、连接查询(内连接、外连接)
- 特征计算 - 遍历求值提速 6 万倍 lambda...if...else(if...else...) +map() 对比 iterrows() - Python代码
- php语录网站,杨泽业:给你的wordpress博客添加经典语录功能,适合所有php网站
- 【线性代数本质】4:矩阵乘法本质
- 信息奥赛一本通(1100:金币)
- imx6q 开发android,SAIL-IMX6Q ANDROID开发环境搭建与系统编译
- docker中的hassio升级_趣说Docker
- hibernate运行很慢?查一张只有几条记录的表都要一俩分钟?[问题记录]
- python os.open禁止写入缓存区_Python-设置文件缓冲类型
- MacCormack差分格式的全局误差分析
- failed to create symbolic link ‘/usr/bin/mysql’: File exists
- iOS开发 iPhone各型号的屏幕参数对照表 (pt 、px)
- apk系统签名小技巧
- Mac OS X 下 su 命令提示 sorry 的解决方法
- Python编程实现数字图像的网络爬虫
- 大热的DevOps,和软件测试的关系竟然是什么呢?
热门文章
- GitHub建立个人网站(三)
- 数据中台赋能企业数字化转型的四个关键成功因素
- 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes
- 技术分享连载(八十九)
- 基于Spring MVC的ECharts动态数据实时展示
- C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)...
- 班扎古鲁白玛的沉默(见与不见)
- ZZULIOJ 1059:最高分
- OJ1039: n个数求和(C语言for循环)
- linux系统mysql密码忘记了怎么办_Linux系统下忘记MySql密码怎么办