Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
前言
每天一道算法题,死磕算法
今天讲解的是leetcode上的第三道题目3. 无重复字符的最长子串
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
分析
既然是求子串的题目,那么使用滑动窗口呀,这也要建立条件反射
上一节我们讲了滑动窗口的模板,那么这一节直接拿来用就可以了
var slidingWindow = function(s,t){
let window = {},need = {};
for(let c of t){
if(need[c]){
need[c] = 0;
}
need[c]++;
}
let left = 0,right =0,valid = 0;
// 开始滑动
while(right<Object.keys(s).length){
let c = s[right];
right++;
// 进行一系列数据操作
while(valid === Object.keys(need).length){
const d = s[left];
left++;
// 进行一系列数据操作
}
// 符合条件的时候,进行操作
}
}
有了模板以后真的做题太简单了,想想咱们上一道题是一道困难的题,咱们用模板都解出来了,所以这个中等的题目用模板更简单
思考
- 首先定义一个maxLength,作为要返回得结果,也就是最长子串,每当滑动窗口符合添加的时候,进行一下记录
maxLength = Math.max(maxLength,Object.keys(window).length);
-
定义记录窗口包含的字符个数的变量window,用来记录滑动后包含的字符的个数
-
定义left,right,也就是滑动窗口的左右区间,然后右区间不断向右滑动,window记录字符个数,如果记录某一个字符===2了,那么就是重复的字符了,左区间也开始向右滑动,直到不包含重复元素,window去掉相应的字符;当满足条件的时候,记录一下maxLength的值
题解
var lengthOfLongestSubstring = function(s) {
// 窗口包含的字符的对象
let window = {};
// 设置左右区间
let left=0,right=0;
// 这是最后返回得结果
let maxLength = 0;
while(right<s.length){
// 右区间开始增大
let c = s[right];
right++;
// 下面是写自己逻辑的地方
if(!window[c]){
window[c]=0;
}
// 窗口包含的字符++
window[c]++;
// 需要收缩左区间了
while(window[c]===2){
let d = s[left];
left++;
// 下面是写自己逻辑的地方
if(window[d]){
window[d]--;
// 注意减减以后一定要删除
if(!window[d]){
delete window[d];
}
}
}
// 此时是符合条件的时候
maxLength = Math.max(maxLength,Object.keys(window).length);
}
return maxLength;
};