题目描述

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

示例 1:

输入: "eceba"
输出: 3
解释: t 是 "ece",长度为3。

示例 2:

输入: "ccaabbb"
输出: 5
解释: t 是 "aabbb",长度为5。

算法分析

为了遍历一遍就得到答案,我们使用一个左指针和一个右指针表示滑动窗口的边界。

一开始,让两个指针都指向 0 ,当窗口包含的字符不超过 2 个不同的字符时,就不断将右指针往右边移动。如果在某一个位置有 3 个不同的字符,就开始移动左指针,直到窗口内包含不超过 2 个不同字符。

沿着字符串移动滑动窗口,并保持窗口内只有不超过 2 个不同字符,同时每一步都更新最长子串的长度。

只有一个问题还没解决 - 如何移动左指针确保窗口内只有 2 种不同的字符?

我们使用一个 hashmap ,把字符串里的字符都当做键,在窗口中的最右边的字符位置作为值。每一个时刻,这个 hashmap 包括不超过 3 个元素。

比方说,通过这个 hashmap ,你可以知道窗口 "eeeeeeeet" 中字符 e 最右边的位置是 8 ,所以必须要至少将左指针移动到 8 + 1 = 9 的位置来将 e 从滑动窗口中移除。

我们的方法时间复杂度是否是最优的呢?答案是是的。我们只将字符串的 N 个字符遍历了一次,时间复杂度是 O(N)

代码

class Solution {
public:int lengthOfLongestSubstringTwoDistinct(string s) {if(s.size() <= 2) return s.size();int res = 0;std::unordered_map<char, int> windows;int left = 0, max_size = 0, kind = 0;for(int i = 0; i < s.length(); ++i) {if(windows[s[i]] == 0) {++kind;}++windows[s[i]];while(kind > 2) {--windows[s[left]];if(windows[s[left]] == 0) {--kind;}++left;}res = std::max(res, i - left + 1);}return res;}
};

时间复杂度分析

时间复杂度:O(N) 其中 N 是输入串的字符数目。

空间复杂度:O(1),这是因为额外的空间只有 hashmap ,且它包含不超过 3 个元素

滑动窗口—至多包含两个不同字符的最长子串(leetcode 159)相关推荐

  1. 滑动窗口—至多包含 K 个不同字符的最长子串(leetcode 340)

    题目描述 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出: 3 解释: 则 T 为 &quo ...

  2. LeetCode 159. 至多包含两个不同字符的最长子串 (滑动窗口哈希表)

    159. 至多包含两个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringTwoDistinct(String s) {// 记录 ...

  3. LeetCode 159. 至多包含两个不同字符的最长子串(滑动窗口)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: ...

  4. 159 至多包含两个不同字符的最长子串

    题目描述: 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "e ...

  5. 力扣(LeetCode)159. 至多包含两个不同字符的最长子串(2022.06.08)

    给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece&quo ...

  6. leetcode159. 至多包含两个不同字符的最长子串

    给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t . 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece",长度为3. 示 ...

  7. 【LeetCode - 159】至多包含两个不同字符的最长子串

    文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解题思路   如果输入字符串 s 的长度小于等于 2,那么它自己就是"至多包含两个不同字符的最长子串",返回 ...

  8. 159. 至多包含两个不同字符的最长子串

    题目 给定字符串s,找最多包含两个不同字符的子串,且需要子串最长 类似   3. 无重复字符的最长子串 https://blog.csdn.net/weixin_51125132/article/de ...

  9. Leecode159:至多包含两个不同字符的最长子串

    m.clear() //清空哈希表 这道题也是使用滑动窗口来解决,我使用的还是Leecode3的那种方法,虽然AC了但是性能不太好, 看官方题解使用的. 忘记了1种情况:到了最后还是一个/两个但是没有 ...

最新文章

  1. 图片验证码把我逼成了人工智障
  2. java提高篇之数组(1):认识JAVA数组
  3. 用台球杆击球,这个击球力道能传递到10米之外的球上吗?
  4. 【动态规划】公共子串
  5. 兰州交通大学计算机科学与技术学院,兰州交通大学
  6. 正则表达式——获取指定IP的物理地址(二)
  7. Win-MASM64汇编语言-JMP指令
  8. React 入门第一天(小案例和注意细节)
  9. CSDN排名更新又出问题了?
  10. ps4正在连接ea服务器,ps4极品飞车19连不上ea服务器 | 手游网游页游攻略大全
  11. UNI-APP,动态设置view的背景图片
  12. win8计算机无法安装打印机驱动程序,电脑打印机无法安装驱动怎么办?如何安装驱动?...
  13. glob.glob() 函数
  14. c语言程序课程设计题目
  15. 安化云台山风景区超详细旅行计划
  16. 基于51单片机的电压采集(ADC0809)
  17. 本地项目开启http-server服务
  18. 关于ESI研究前沿的思考和使用方法研究
  19. 关于SpringCloud Alibaba,动力节点的这份笔记教程真香
  20. C语言求一元二次函数的解

热门文章

  1. 网狐荣耀斗地主等15合1(美女图)
  2. 计算机网络(5)体系结构:计算机网络分层结构
  3. Docker Swarm学习教程【转载】
  4. Laravel使用swagger PHP生成api接口文档
  5. opencv cvRound函数cvClone
  6. 分布式系统理论:Quorum算法
  7. 大数据的流处理和批处理及其框架
  8. orthWind 数据库结构说明
  9. iOS 15Beta5版本更新变化,这些细节你发现了吗?
  10. Windows10 关于系统中断CPU占用过高导致电脑变卡的解决办法