前言
本文已收录 GitHub https://github.com/ponkans/F2E(有怪怪整理的大前端知识技能树),欢迎 Star,持续更新💧
说实话,第一次写算法的怪怪,有点紧张,毕竟是一个数学怎么也及不了格的小菜。
大一上期末全班倒数第4,噗呲,学渣实锤~
写之前有在想,怎么把算法写的比较有意思,就像大学高数课,说实话,老师讲的是真心无聊。。
如果不是被所谓的学业规则所限制,真的很难听下去。
设 M(x0,y0,z0) 为平面上的已知点,n=(A,B,C) 为法向量,M(x,y,z) 为平面上的任一点,则平面的点法式方程为 xxxx,听着听着就睡着了。。。(老师,我扛不住了!!)
所以,怪怪会尽量写得有趣一点,让你看完差不多可以记住这个算法思想。
今天的题目是这样的,给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
简单解释一下。
比如给定字符串“丙丙接水怪接”
第一步,找出字符串中不含有重复字符的子串
- 丙
- 丙接
- 丙接水
- 丙接水怪
- 水怪接
第二步,计算出各个子串的长度,并取最大值。
- 在这里最大值显然就是 4,所以答案就是 4
ok,做完例题,其实很容易可以发现,核心就是第一步,找出不含有重复字符的子串。
那究竟要怎么找呢,为了便于第一次看这个算法的小伙伴好理解,我画了几张图,大家看完还不懂,加微信骂我渣男好了!
找两把枪,起始的时候都指向第一个字符。
我们顺利的找到了第一个不重复的子串,“丙”。
接着保持红枪不动,绿枪向后移动一位。
此时发现两枪之间,字符重复了,找到跟绿枪重复的位置,并且将红枪移动到重复位置的后一位,那么此时变成了下面这个样子。
于是我们找到了,第二个不重复的子串,跟第一个一样,也是“丙”。
不慌,我们接着移动绿枪。
由于,在移动过程中,红绿枪之间一直没有重复,我们找到了不重复子串“丙接”、“丙接水”、“丙接水怪”
不急不急,还没完,接着移动绿枪(绿枪已到最后一位,结束)
可以发现,当我们移动完绿枪到 “接”,此时红绿之间的子串出现了重复的 “接”,于是我们还是按之前重复的思路:
- 找到重复字符 “接” 的位置
- 将红枪移动到位置的后一位,即 “水”
- 得到红绿之间不重复子串 “水怪接”
由此可见,当我们的绿枪移动到最后一位的时候,我们的找寻也就结束了,所有不重复的子串我们也都找到了。
其实上面的红枪,绿枪,换一种说法就是左右指针,移动红绿枪,就是移动左右指针,两指针之间的窗口就是我们要的结果。
很像我们剪视频的时候,拖动的那个截取视频进度的东东。。
这种解题的思想,就是大家常说的滑动窗口。
理解了思想,写代码其实就比较简单了。
直接上 LeetCode 原题跟代码,一些边界情况我写在注释里面了(仔细看注释哦,边界没写对会有问题哦)。去除注释 10 行代码左右,建议第一次做的小伙伴动手写一下,相信我,一定能写出来。
说不定开启了你的 LeetCode 算法之旅哦💗~
小结
滑动窗口的题,其实就是要搞清楚左右滑的界限是啥[吃瓜],比如上面这个题左窗口啥时候收缩就是关键。
开了一个算法系列的专栏,后续会写一些算法相关的,近期算法应该都会围绕滑动窗口相关的展开去讲。
上一篇国庆小结提到了一些技术,近期大概率是这个节奏发文章
- redux 源码、设计思想
- promise、generator、async await 源码(毕竟工作中高频使用,需要看看)
- 常用 hooks 源码分析(新公司技术栈就是 React 这一套)
- 算法
我是接水怪,一个普普通通的程序员。感谢各位的关注与3连💕😊
联系我 / 公众号
微信搜索【接水怪】回复”加群“,我会拉你进技术交流群。讲真的,在这个群,哪怕您不说话,光看聊天记录也是一种成长。(阿里技术专家、敖丙作者、Java3y、蘑菇街资深前端、蚂蚁金服安全专家、各路大牛都在)。
接水怪也会定期原创,定期跟小伙伴进行经验交流或帮忙看简历。加关注,不迷路,有机会一起跑个步🏃 ↓↓↓