滑动窗口—至多包含两个不同字符的最长子串(leetcode 159)
题目描述
给定一个字符串 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)相关推荐
- 滑动窗口—至多包含 K 个不同字符的最长子串(leetcode 340)
题目描述 给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T. 示例 1: 输入: s = "eceba", k = 2 输出: 3 解释: 则 T 为 &quo ...
- LeetCode 159. 至多包含两个不同字符的最长子串 (滑动窗口哈希表)
159. 至多包含两个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringTwoDistinct(String s) {// 记录 ...
- LeetCode 159. 至多包含两个不同字符的最长子串(滑动窗口)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: ...
- 159 至多包含两个不同字符的最长子串
题目描述: 给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "e ...
- 力扣(LeetCode)159. 至多包含两个不同字符的最长子串(2022.06.08)
给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度. 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece&quo ...
- leetcode159. 至多包含两个不同字符的最长子串
给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t . 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece",长度为3. 示 ...
- 【LeetCode - 159】至多包含两个不同字符的最长子串
文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解题思路 如果输入字符串 s 的长度小于等于 2,那么它自己就是"至多包含两个不同字符的最长子串",返回 ...
- 159. 至多包含两个不同字符的最长子串
题目 给定字符串s,找最多包含两个不同字符的子串,且需要子串最长 类似 3. 无重复字符的最长子串 https://blog.csdn.net/weixin_51125132/article/de ...
- Leecode159:至多包含两个不同字符的最长子串
m.clear() //清空哈希表 这道题也是使用滑动窗口来解决,我使用的还是Leecode3的那种方法,虽然AC了但是性能不太好, 看官方题解使用的. 忘记了1种情况:到了最后还是一个/两个但是没有 ...
最新文章
- 图片验证码把我逼成了人工智障
- java提高篇之数组(1):认识JAVA数组
- 用台球杆击球,这个击球力道能传递到10米之外的球上吗?
- 【动态规划】公共子串
- 兰州交通大学计算机科学与技术学院,兰州交通大学
- 正则表达式——获取指定IP的物理地址(二)
- Win-MASM64汇编语言-JMP指令
- React 入门第一天(小案例和注意细节)
- CSDN排名更新又出问题了?
- ps4正在连接ea服务器,ps4极品飞车19连不上ea服务器 | 手游网游页游攻略大全
- UNI-APP,动态设置view的背景图片
- win8计算机无法安装打印机驱动程序,电脑打印机无法安装驱动怎么办?如何安装驱动?...
- glob.glob() 函数
- c语言程序课程设计题目
- 安化云台山风景区超详细旅行计划
- 基于51单片机的电压采集(ADC0809)
- 本地项目开启http-server服务
- 关于ESI研究前沿的思考和使用方法研究
- 关于SpringCloud Alibaba,动力节点的这份笔记教程真香
- C语言求一元二次函数的解