一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
Hi, 大家好。我是新人,程序员库里。
今后会按类分享算法题。
今天给大家分享第14道leetcode上数组中使用双指针相关的算法题。
3. 无重复字符的最长子串
leetcode地址:leetcode-cn.com/problems/lo…
难度
中等
描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例1
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解法
1.采用滑动窗口的方法
2.定义左指针left,初始值是0
3.定义变量res,初始值是0,表示最长无重复字符的最长子串的长度
4.使用Map来存储字符和对应的下标
5.开始遍历,定义右指针right,初始值是0
6.如果出现了重复字符,则把左指针移到重复字符的下一位。注意同时满足重复字符的索引大于左指针。
7.取res和滑动窗口长度的最大值,赋值给res,表示最后的结果
8.使用map中的set方法记录每个字符的下标
9.当遍历完后,res表示最长的子串长度,返回即可
代码
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
let l = 0; // 定义左指针
let res = 0; // 结果
let map = new Map(); // 存放字符和对应下标
for (let r = 0; r < s.length; r++) {
// 如果出现了重复字符,则把左指针移到重复字符的下一位。注意同时满足重复字符的索引大于左指针。
if (map.has(s[r]) && map.get(s[r]) >= l) {
l = map.get(s[r]) + 1;
}
res = Math.max(res, r - l + 1); // 计算结果
map.set(s[r], r); // 存下每个字符的下标
}
return res;
};