leetcode-数组-3.-无重复字符的最长子串

113 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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;
};