当前位置:网站首页>LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一:解题思路
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一:解题思路
2022-08-02 08:08:00 【51CTO】
欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos
笔者在完成LeetCode第三题(Longest Substring Without Repeating Characters)时,经历了设计、实现、优化三个阶段,于是通过这个三部曲系列,将当初的整个过程重现,希望有兴趣的读者来一起讨论;
先来看下优化后的最终效果,如下图,编程语言是Java,17毫秒完成,超越99.94%的提交方案:
上述成绩的地址是: https://leetcode.com/submissions/detail/199426736/
三部曲说明
- 整个系列由三篇文章组成:
- 第一篇,也就是本文,描述基本解题思路;
- 第二篇,根据解题思路完成初版的代码实现,目标是保证功能正常,能在LeetCode网站提交成功;
- 第三篇,针对初版代码做了两轮优化,每轮都有一个优化的重点,最终将耗时从40ms以上优化到17ms;
题目简介
- 题目地址是: https://leetcode.com/problems/longest-substring-without-repeating-characters/
- 题目内容:输入一个字符串例如"abcabcbb",找到最长的不重复的字符串的长度返回,这里应该返回的是"abc"的长度3;
解题思路简述
- 该题的关键是设计一个"滑动窗口",里面存的是最长的不重复字符串,一开始这个窗口是空的,如下图,绿色代表滑动窗口,蓝色的是外部输入的字符串:
- 从字符串的第一个元素开始,执行这个逻辑:
- 用一个变量保存当前已经发现的最大长度,假设名为maxLen;
- 如果当前检查的元素在窗口中没有,就加入窗口,例如窗口中已经有了"ab",当前是"c",那么窗口中最大长度加一;
- 如果当前检查的元素在窗口中存在,例如窗口中已经有了"abc",当前检查的元素是"a",这个"a"在窗口总已经存在了,窗口作调整,窗口中的"a"和它左侧的所有元素全部移除窗口,再把当前检查的"a"元素加入窗口;
- 拿当前窗口的长度和maxLen比较,大的值存入maxLen中;
- 继续检查字符串的下一个元素,逻辑是前面的步骤;
思路详细图解
以前面的"abcabcbb"为例,来把上述逻辑用图片演示一遍;
检查完第一个元素后,窗口效果如下图,可见第一个元素已经纳入窗口中:
检查完第三个元素后,效果如下图,maxLen等于3,三个元素纳入窗口:
检查到第四个元素是"a",那么窗口的左侧和右侧都开始滑动,maxLen等于3,当前窗口中的长度也是3,因此maxLen不变,如下图:
继续检查第5个元素,这次遇到的"b"在窗口中也存在,处理如下图:
继续检查第6个元素,这次遇到的"c"在窗口中也存在,所以第一个"c"移出窗口,第二个"c"加入窗口,窗口内的元素还是3个,所以maxLen保持不变,处理如下图:
检查第7个元素"b",窗口中已经有"b"了,所以左侧窗口向右收缩,将里面原有的中的"b"移出,右侧窗口向右扩张,将第7个元素"b"纳入窗口中,此时窗口中元素数量为2,小于maxLen,所以maxLen不变,如下图:
检查第8个元素"b",发现窗口中已经有"b"了,只能将窗口中的"b"(第7个元素)和它左侧的"c"(第6个元素)都从窗口中移出,再把第8个元素纳入窗口,此时窗口中只有一个元素,因此maxLen不变,如下图:
数组已经遍历完毕,返回maxLen=3,解题结束;
以上就是解题思路,用代码来实现整个思路并不难,下一篇文章我们来看下基本的代码实现;
欢迎关注51CTO博客:程序员欣宸
边栏推荐
- Button to control the running water light (timer)
- AttributeError: module ‘clr‘ has no attribute ‘AddReference‘
- 小说里的编程 【连载之二十三】元宇宙里月亮弯弯
- 解决IDEA安装安装插件慢问题
- Codeforces Round #811 (Div. 3)无DF
- Redisson的看门狗机制
- Redisson distributed lock source code analysis for high-level use of redis
- 17、生成长图,并上传至服务器
- 【特别提醒】订阅此专栏的用户请先阅读本文再决定是否需要购买此专栏
- [ansible]playbook结合项目解释执行步骤
猜你喜欢
IO进程线程->进程->day4
血气方刚的年轻小伙竟去做家政小哥,是怎样成功逆袭转行的
用C写小游戏(三子棋)
【C】关于柔性数组.简要的谈谈柔性数组
Write a small game in C (three chess)
[ansible] playbook explains the execution steps in combination with the project
Biotin-EDA|CAS:111790-37-5| 乙二胺生物素
PyCharm使用教程(详细版 - 图文结合)
CASA模型、CENTURY模型应用与案例分析
PyQt5(一) PyQt5安装及配置,从文件夹读取图片并显示,模拟生成素描图像
随机推荐
下一个排列
etcd implements large-scale service governance application combat
血气方刚的年轻小伙竟去做家政小哥,是怎样成功逆袭转行的
[OC学习笔记]Block三种类型
【电子电路】长按键拉低电平,适用在有休眠机制的MCU但是没有看门狗,一个按键多个功能场景下使用
高仿【华为消费者业务官网】和精彩动画剖析:练习在低代码平台中嵌入JS代码
(Note)阿克西斯ACASIS DT-3608双盘位硬盘阵列盒RAID设置
【C】关于柔性数组.简要的谈谈柔性数组
OneNote 教程,如何在 OneNote 中创建更多空间?
Spark 系统性学习笔记系列
JSP页面中page指令contentPage/pageEncoding具有什么功能呢?
Biotin - LC - Hydrazide | CAS: 109276-34-8 | Biotin - LC - Hydrazide
pycharm的基本使用教程(1)
基于PyTorch的flappy bird游戏
Database Plus 的云上之旅:SphereEx 正式开源 ShardingSphere on Cloud 解决方案
7.联合索引(最左前缀原则)
Biotin-EDA|CAS:111790-37-5| 乙二胺生物素
TiFlash 存储层概览
三维体尺测量
[OC学习笔记]ARC与引用计数