【我的力扣战纪】双指针-3-无重复字符的最长子串

88 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

你的随口一句,不管是否敷衍,我都会放进心里,然后去做,去改

原题链接:3-无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 10^4
  • s 由英文字母、数字、符号和空格组成

思路

  • 在遍历的时候,用双指针维护一个滑动窗口的左右边界,左指针负责收缩边界,右指针负责扩张边界
  • 右指针不断滑动的过程中,如果元素不重复,就不断往哈希表里添加;如果遇到重复元素,就控制左指针收缩边界,并记录子串长度

Code

const lengthOfLongestSubstring = s => {
	let slow=0,// 左指针
	    res = 0, //返回值
	    map = new Map(); // 创建哈希表存放字符和对应下标
	for (let fast = 0; fast < s.length; fast++) {
		// 如果出现了重复字符并且重复字符的索引大于左指针,就把左指针移动到对应字符的下一位
		if (map.has(s[fast]) && map.get(s[fast]) >= slow) {
			slow = map.get(s[fast]) + 1;
		}
		res = Math.max(res,fast - slow + 1); //取最长子串的长度
		map.set(s[fast], fast); // 存下每个字符的下标
	}
	return res;
};