力扣-3. 无重复字符的最长子串(滑动窗口法)
力扣-3. 无重复字符的最长子串
来源:力扣
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
滑动窗口
滑动窗口法:定义两个指针,一个快指针,一个慢指针,慢指针是窗口的起始位置,快指针是窗口的结束位置,我们需要维持窗口中的一定规则。
在这道题中窗口中不能存在相同的字符,如果存在相同的字符我们就让慢指针向右滑动,如果不存在就让快指针向右滑动,在左指针向右移动的时候,我们从数组中移除一个字符,在右指针向右移动的时候,我们往数组中添加一个字符。
我们需要找到窗口的最大长度,所以还需要一个变量来保存最大长度,最后返回最大长度就可以了。
解题过程
JavaScript代码
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
//滑动窗口法,维持窗口中的字符子串不含重复字符,记录它的最长长度
let i = 0;
let j = 0;
let res = [];
let lens = s.length;
let max = 0;
if(lens<=0){
return 0;
}
while(j<lens){
if(res.indexOf(s[j])==-1){
res.push(s[j]);
j++;
}else{
if(max<(j-i)){
max = j-i;
}
i++;
res.shift();
}
}
if(max<(j-i)){
max = j-i;
}
return max;
};