# LeetCode算法学习之- 滑动窗口-[3. 无重复字符的最长子串]

101 阅读1分钟

题目

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

分析

  1. 无重复的子串

  2. 需要求得最长的

解法:滑动窗口


思想
1. 使用滑动窗口,快慢2个指针
 1. 每次移动快指针,如果与 之前有重复的 则移动慢指针
 2. 如果没有重复的 则不断更新 max= Math.max(max, i + 1 - j)
*/
var lengthOfLongestSubstring = function (s) {
  // 特殊情况 当s为空时候直接返回0
  if (s.length === 0) return 0;

  // 初始化 快慢指针 和 max 
  let max = 1;
  let j = 0;
  // 快指针从1开始向前移动
  for (let i = 1; i < s.length; i++) {
    let index = i - 1;
    // 每次走一步就判断, 从i-1 到j的过程中 有无重复元素
    while (index >= j) {
      if (s[index] === s[i]) {
        break;
      }
      index--;
    }
    // index===j-1 说明无重复
    if (index === j-1) {
      max = Math.max(max, i + 1 - j);
    } else {
      // 如果有重复 则移动j 到重复元素的后一位上
      j = index + 1;
    }
  }

  return max;
};

//时间复杂度:O(n^2)
//空间复杂度:O(1)

总结

今天这道题是主要是练习如何使用不固定尺寸的滑动窗口 来求连续子串类题目

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com

\