这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
附上原题链接:3. 无重复字符的最长子串
一、了解题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
二、题解分析
(1)解题思路
- 先找出所有不包含重复字符的子串;
- 找出长度最大的那个子串,返回其长度即可。
(2)解题步骤
- 用双指针维护一个滑动窗口,用来剪切子串;
- 不断移动右指针,遇到重复字符的,就把左指针移动到重复字符的下一位;
- 在移动的过程中,记录所有窗口的长度,并返回最大值。
三、代码实现
依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:
/**
*
* @param {String} s
* @returns number
*/
let lengthOfLongestSubstring = function(s){
// 1.定义一个左指针l
let l = 0;
// 2.定义res,用来存放最大值
let res = 0;
// 3.定义一个字典
const map = new Map();
// 4.定义一个右指针,并不断滑动右指针
for(let r = 0; r < s.length; r++){
// 4.2 当在字典中遇到与当前索引所对应的值相等时
// map.get(r) >= l 确保下标在左指针右边
if(map.has(s[r]) && map.get(s[r]) >= l){
// 4.2.1 左指针指向原来右指针位置的下一个位置
l = map.get(s[r]) + 1;
}
// 4.3 比较原来的最大值和res值,看看两个值哪个更大
res = Math.max(res, r - l + 1);
// 4.1 将当前下标的值及下标存放到字典中
map.set(s[r], r);
}
// 5.返回最终结果
return res;
}
console.log(lengthOfLongestSubstring('ssdfsf'));
以上就是关于无重复字符的最长子串的题解,不知道对小伙伴们是否有帮助呢?
我们下期见👋👋👋