js算法题解(第32天)--leetcode 3. 无重复字符的最长子串

120 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

前言

每天一道算法题,死磕算法

今天讲解的是leetcode上的第三道题目3. 无重复字符的最长子串

题目

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

示例 1:

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

分析

既然是求子串的题目,那么使用滑动窗口呀,这也要建立条件反射

上一节我们讲了滑动窗口的模板,那么这一节直接拿来用就可以了

var slidingWindow = function(s,t){
 let window = {},need = {};
 for(let c of t){
   if(need[c]){
     need[c] = 0;
   }
   need[c]++;
 }
 let left = 0,right =0,valid = 0;
 // 开始滑动
 while(right<Object.keys(s).length){
   let c = s[right];
   right++;
   // 进行一系列数据操作
   while(valid === Object.keys(need).length){
       const d = s[left];
       left++;
       // 进行一系列数据操作

   }
   // 符合条件的时候,进行操作
  
 }
}

有了模板以后真的做题太简单了,想想咱们上一道题是一道困难的题,咱们用模板都解出来了,所以这个中等的题目用模板更简单

思考

  1. 首先定义一个maxLength,作为要返回得结果,也就是最长子串,每当滑动窗口符合添加的时候,进行一下记录
maxLength = Math.max(maxLength,Object.keys(window).length);
  1. 定义记录窗口包含的字符个数的变量window,用来记录滑动后包含的字符的个数

  2. 定义left,right,也就是滑动窗口的左右区间,然后右区间不断向右滑动,window记录字符个数,如果记录某一个字符===2了,那么就是重复的字符了,左区间也开始向右滑动,直到不包含重复元素,window去掉相应的字符;当满足条件的时候,记录一下maxLength的值

题解

var lengthOfLongestSubstring = function(s) {
  // 窗口包含的字符的对象
  let window = {};
  // 设置左右区间
  let left=0,right=0;
  // 这是最后返回得结果
  let maxLength = 0;
  while(right<s.length){
    // 右区间开始增大
    let c = s[right];
    right++;
    // 下面是写自己逻辑的地方
    if(!window[c]){
      window[c]=0;
    }
    // 窗口包含的字符++
    window[c]++;
    
    // 需要收缩左区间了
    while(window[c]===2){
      let d = s[left];
      left++;
      // 下面是写自己逻辑的地方
      if(window[d]){
        window[d]--;
        // 注意减减以后一定要删除
        if(!window[d]){
          delete window[d];
        }
      }
    }
    // 此时是符合条件的时候
    maxLength = Math.max(maxLength,Object.keys(window).length);
    
  }
  return maxLength;
};

参考