# LeetCode算法学习之- 滑动窗口-[159. 至多包含两个不同字符的最长子串]

181 阅读1分钟

题目

给定一个字符串 *s* ,找出 至多 包含两个不同字符的最长子串 *t* ,并返回该子串的长度。

分析

\1. 子串max=》 动态滑动窗口

\2. 至多包含2个不同字符串 =》 map

解法:滑动窗口


思想
1. 最长子串 =》 动态滑动窗口
2. 至多2个=》 使用map 和count 来评估是否满足条件, 如果count>2则需要左边收缩 直到满足条件未知
3. 最大长度=》 满足条件后 不断更新max 
*/

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstringTwoDistinct = function (s) {
  // 初始化结果
  const map = {};
  let max = 0;
  // 左指针
  let j = 0;
  let count = 0;

  // 迭代有指针 i
  for (let i = 0; i < s.length; i++) {
    // 如果有新的元素 则count ++
    if (!map[s[i]]) {
      count++;
      map[s[i]] = 0;
    }

    map[s[i]] = map[s[i]] + 1;
    // 如果count大于2 则左收敛j
    while (count > 2 && j <= i) {
      map[s[j]] = map[s[j]] - 1;
      // 移除新的字符 则count--
      if (map[s[j]] === 0) {
        count--;
      }
      j++;
    }
    max = Math.max(max, i - j + 1);
  }

  return max;
};

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


总结

今天这道题是主要是练习如何使用动态的滑动窗口 来求最大连续子字符串的题目

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

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

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

\