【滑动窗口】leetcode3:无重复字符的最长子串

一.题目描述

无重复字符的最长子串

 二.思路分析

题目要求我们找符合要求的最长子串,要求是不能包含重复字符

确定一个子串只需确定它的左右区间即可,于是我们可以两层循环暴力枚举所有的子串,找到符合要求的,并通过比较得到最长的长度。还有一个问题,怎么确定有没有重复字符呢?可以使用哈希表,如果把字符丢进哈希表后没有重复,那么right继续向后枚举,如果重复了直接退出循环,后面的不用枚举了,肯定也会重复。

class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.size();int ret = 0;for (int left = 0; left < n; left++){int hash[128] = {0};for (int right = left; right < n; right++){int in = s[right];hash[in]++;if (hash[in] > 1)//出现重复的字符了{break;}//没有出现重复字符ret = max(ret, right - left + 1);}}return ret;}
};

两层for循环,时间复杂度是O(n^2),leetcode上面不会超时能通过。但用暴力枚举太浪费这道题了,可以使用滑动窗口优化。

要想使用滑动窗口必须证明left和right都只会向前移动。

 left固定在第一个位置,right不断向后移动,移动过程中,如果没有出现重复字符则不断更新结果。当right移动到如图所示位置时,出现了重复字符,故left位置已经枚举完毕。

按照暴力枚举方法,left向前移动一步,right回退到left位置。但是最终right还是会走到原先标记的位置。因为经过上一轮枚举,[left - 1, tmp)区间内都是没有重复字符的,所以right会一直往前走。

所以right不必退回来,保持在原地不动,让left向右移动即可。我们发现此时区间内没有重复元素了,所以要更新结果,right继续向后移动。接下来的步骤就和前面的一样了。但是这里的left向后移动一步刚好就跳过了那个重复的元素,接下来我们看一个不一样的例子

 这里区间内出现重复元素,left向后移动一步

 但此时还是有重复元素,此时right也没有必要向后枚举了,因为肯定也是重复的。所以left还要继续向后移动,直到跳过重复的字符w,right才能被解放,继续向后移动。故left可能向后移动多步,这是一个循环的过程。

三.代码编写

 

 根据滑动窗口的代码模版,我们只需确定以上几个具体的步骤。那么什么时候更新结果呢?当我们找到符合要求的子串是就更新,什么时候是符合要求的呢?

当判断条件不成立

或者判断条件成立,但通过不断地出窗口,最终使判断条件不成立时是符合要求的。所以更新结果应该放在整个循环的最后。

class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.size();int ret = 0;int hash[128] = {0};int left = 0, right = 0;while (right < n){//进窗口int in = s[right];hash[in]++;//判断while (hash[in] > 1){//出窗口int out = s[left];hash[out]--;left++;}//更新结果ret = max(ret, right - left + 1);right++;}return ret;}
};

时间复杂度O(n),效率大大提升

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

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

相关文章

区分什么是Java内存模型(JMM)和 JVM运行时数据区

文章目录 一、概念区分1、什么是内存模型&#xff1f;什么是&#xff08;内存区域&#xff09;运行时数据区&#xff1f;2、为什么要有Java内存模型&#xff1f;2.1、硬件的效率与一致性2.2、 CPU和缓存的一致性2.2.1、为什么需要CPU cache&#xff1f;2.2.2、三级缓存&#xf…

C++信息学奥赛1142:单词的长度

#include <iostream> #include <string> using namespace std; int main() {string str1;// 输入一行字符串getline(cin,str1);int n0;for(int i0;i<str1.length();i){if(str1[i] ){while (str1[i1] ){i; // 跳过连续的空格}cout<<n<<","…

【夏令时】用@JsonFormat(pattern = “yyyy-MM-dd“)注解,出生日期竟然年轻了一天

前言 &#x1f34a;缘由 用JsonFormat(pattern “yyyy-MM-dd”&#xff09;注解&#xff0c;出生日期竟然年轻了一天 艺术源于生活&#xff0c;bug源于开发。 起因是艰苦奋战一个月&#xff0c;测试及验收都顺利通过&#xff0c;上线也稳稳的成功。但是毒奶总是在不经意给你…

探索数据的维度:多元线性回归在实际应用中的威力

文章目录 &#x1f340;引言&#x1f340;什么是多元线性回归&#xff1f;&#x1f340;多元线性回归的应用&#x1f340;构建多元线性回归模型的步骤&#x1f340;R-squared&#xff08;R平方&#xff09;&#x1f340;多元线性回归案例---波士顿房价 &#x1f340;引言 当谈…

启动metastore服务报错

启动Metastore的时候报错&#xff1a; 简略的报错信息&#xff1a; MetaException(message:Error creating transactional connection factory)Caused by: MetaException(message:Error creating transactional connection factory)Caused by: javax.jdo.JDOFatalInternalExce…

网络安全02-C段扫描、开放端口

查询网站IP https://seo.chinaz.com/hetianlab.com 扫描指定IP&#xff1a;例&#xff1a;nmap -A -T4 ww.hetianlab.com -oX out.html 扫描指定段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.113.1-200 扫描整个C段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.…

Request对象和response对象

一、概念 request对象和response对象是通过Servlet容器&#xff08;如Tomcat&#xff09;自动创建并传递给Servlet的。 Servlet容器负责接收客户端的请求&#xff0c;并将请求信息封装到request对象中&#xff0c;然后将request对象传 递给相应的Servlet进行处理。类似地&…

MyBatis与Spring的集成整合加优化分页功能

目录 一.为什么要将MyBatis和Spring整合&#xff1f;&#xff1f;&#xff1f; 二.配置环境 2.1 pom文件 2.2 xml文件 三.演示举例 四.Aop整合pageHelper 分页插件 今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.为什么要将MyBatis和Spring整合&#xff1f…

[Mac软件]Pixelmator Pro 3.3.12 专业图像编辑中文版

Pixelmator Pro是专为Mac设计的功能强大&#xff0c;美观且易于使用的图像编辑器。借助广泛的专业级无损图像编辑工具&#xff0c;Pixelmator Pro可使您发挥出最佳的照片效果&#xff0c;创建华丽的构图和设计&#xff0c;绘制&#xff0c;绘画&#xff0c;应用令人惊叹的效果&…

学习中ChatGPT的17种用法

ChatGPT本质上是一个聊天工具&#xff0c;旧金山的人工智能企业OpenAI于2022年11月正式推出ChatGPT。那么&#xff0c;ChatGPT与其他人工智能产品相比有什么特殊呢&#xff1f; 它除了可以回答结构性的问题&#xff0c;例如语法修正、翻译和查找答案之外。最关键的是它能够去解…

Android Studio中引入MagicIndicator

1.github中下载文件 GitHub - hackware1993/MagicIndicator: A powerful, customizable and extensible ViewPager indicator framework. As the best alternative of ViewPagerIndicator, TabLayout and PagerSlidingTabStrip —— 强大、可定制、易扩展的 ViewPager 指示器框…

Nuxt.js--》添加路由、视图和过渡效果

博主今天开设Nuxt.js专栏&#xff0c;带您深入探索 Nuxt.js 的精髓&#xff0c;学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识&#xff0c;还是希望掌握进阶技巧&…