[算法]滑动窗口
案例:对输入字符串求取其最长无重复字符子串
暴力方式:在所有子串中找出满足条件最长的,复杂度O(n2)
采用滑动窗口可简化过程
滑动窗口 —— 双指针框选一段存储区域
解决查找满足一定条件连续区间的问题
基本思路
- 需要头尾指针来框定区间 [每次移动前获取区间内容以备后用]
- 头尾指针从起始端开始,先移动尾指针直至(不)满足条件
,移动头指针直至再次(不)满足条件,再次移动尾指针 - 期间在满足目标时,缓存结果
重难点
- 必须针对连续区间问题,如子串,子数组等
- 如何移动,条件的确定是需要思考的,如根据实际问题指针多移可显著减少运算
”求最短“往往头尾指针都考虑满足的情况以达到缩小区间的目的,
"求最长"头指针需要移动到满足条件的位置 - 缓存目标结果的时机需要确定,这一步还可提前筛选出最终结果
应用
- 对输入字符串求取其最长无重复字符子串,输出
‘字符串’: 长度
function LongestSubstring(str) {
let left = 0 // 头指针
let right = 0 // 尾指针
let count = str.length ? 1 : 0 // 用于缓存目标结果
let subStr = str[0] || '' // 用于缓存目标结果
while (right < str.length) {
let subTemp = str.slice(left, right) // 获取区间内容
let charIndex = subTemp.indexOf(str[right])
if (~charIndex) { // 比较下一位元素是否重复
// 重复(不满足条件)头指针应移过重复位置
left = left + charIndex + 1
right++
} else {
right++ // 不重复(满足条件)继续移动尾指针
// 缓存目标结果
subTemp = str.slice(left, right)
if (subStr.length < subTemp.length) {
subStr = subTemp
count = subTemp.length
}
}
}
return `'${subStr}':${count}`
}
内容会不断更新,欢迎批评指正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
2021-09-07 el-tree 在 el-dialog 显示时 重新加载 el-tree (el-tree采用懒加载)
2021-09-07 组件事件不响应 监听组件内的事件 忘记子组件需要emit
2021-09-07 函数中存在异步的 return 时,误认为其后的代码不会执行