题目描述
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
解题思路

- 先找出所有不包含重复字符的字串,这个是本题的难点和突破口。
- 找出长度最大的那个字串,即为结果。
解题步骤
- 用双指针维护一个滑动窗口,用来剪切字串。
- 双指针: 两个变量来记录子串的起始位置和结束位置,它们可以维护一个滑动窗口
- 滑动窗口:在一些音视频剪切软件上,通常都有一个滑动窗口,拖动窗口的左右边框改变窗口大小来剪切音视频。我们剪切字符串也是这样的,包括我们JavaScript的求子串的方法
slice也是一个滑动窗口。简而言之即为所要剪切字符串的起始位置和结束位置。
- 不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位。
- 过程中记录所有窗口的长度,并返回最大值
代码实现
/*** @param {string} s* @return {number}*/var lengthOfLongestSubstring = function (s) {let left = 0let res = 0const map = new Map()const len = s.lengthfor (let right = 0; right < len; right++) {if (map.has(s[right]) && map.get(s[right]) >= left) { //map.get(s[right]) >= left 重复下标必须在滑动窗口里面,left即为滑动窗口起始位置left = map.get(s[right]) + 1}res = Math.max(res, right - left + 1) // 与原res进行长度的对比并将最大值更新给resmap.set(s[right], right) // 记录下标}return res};
时间复杂度O(n)
空间复杂度O(m), m为字符串中不重复字符的个数
