Skip to main content

无重复字符的最长子串

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



示例 1:

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

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

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
if(s.length <= 1) {
return s.length
}
let start = 0;
let end = 0
let max = 0;
const map = new Map();
for(; end < s.length; end ++) {
const cur = s[end]
if(map.has(cur)) {
start = Math.max(map.get(cur) + 1, start)
}
max = Math.max(max, end - start + 1)
map.set(cur, end)
}
return max
};

题解

利用滑动窗口的思路去完成,主要是利用头指针和尾指针,在遍历时,尾指针向右依次挪动,而map用于记录当前数与小标的关系,当遍历到重复数字时,map可以检测出是何处是最开始的位置,那么将start的位置信息切换到最大值(防止头指针左移),每次遍历结束前,计算当前的字符串长度,存取它的最大值。

更佳的解

思路和上面一样,但是没有用hashMap 而是用数组代替

/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const arr = [];
let start = 0;
let max = 0;
const len = s.length;
for(let end = 0; end < len; end ++) {
let char = s.charCodeAt(end);
start = Math.max(start + 1, arr[char] || 0);
max = Math.max(max, end -start + 1)
arr[char] = end
}
return max
};