当前位置:网站首页>leetcode:159.最多有两个不同字符的最长子串
leetcode:159.最多有两个不同字符的最长子串
2022-08-10 16:39:00 【OceanStar的学习笔记】
题目来源
题目描述
给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度。
示例 1:
输入: “eceba”
输出: 3
解释: t 是 “ece”,长度为3。
示例 2:
输入: “ccaabbb”
输出: 5
解释: t 是 “aabbb”,长度为5。
class Solution {
public:
int lengthOfLongestSubstringTwoDistinct(string s) {
}
};
题目解析
思路
- 用一个map,key为字符,value为字符出现次数。
- 如果map的映射数量超过2个的时候,就删除一个映射
- 比如此时 HashMap 中e有2个,c有1个,此时把b也存入了 HashMap,那么就有三对映射了
- 这时 left 是0,先从e开始,映射值减1,此时e还有1个,不删除,left 自增1
- 这时 HashMap 里还有三对映射,此时 left 是1,那么到c了,映射值减1,此时e映射为0,将e从 HashMap 中删除,left 自增1
- 然后更新结果为 i - left + 1,以此类推直至遍历完整个字符串
class Solution {
public:
int lengthOfLongestSubstringTwoDistinct(string s) {
int res = 0, left = 0;
unordered_map<char, int> m;
for (int i = 0; i < s.size(); ++i) {
++m[s[i]];
while (m.size() > 2) {
if (--m[s[left]] == 0) m.erase(s[left]);
++left;
}
res = max(res, i - left + 1);
}
return res;
}
};
思路
- 用一个map,key为字符,value为字符最新的坐标
- 比如题目中的例子 “eceba”,遇到第一个e,映射其坐标0,遇到c,映射其坐标1,遇到第二个e时,映射其坐标2,当遇到b时,映射其坐标3
- 如果map的映射数量超过2个的时候,就删除一个映射
- 从left开始往右找,看每个字符在map中的映射值是否等于当前left()
- 比如第一个e,HashMap 此时映射值为2,不等于 left 的0,那么 left 自增1,遇到c的时候,HashMap 中c的映射值是1,和此时的 left 相同,那么我们把c删掉,left 自增1,再更新结果
class Solution {
public:
int lengthOfLongestSubstringTwoDistinct(string s) {
int res = 0, left = 0;
unordered_map<char, int> m;
for (int i = 0; i < s.size(); ++i) {
m[s[i]] = i;
while (m.size() > 2) {
if (m[s[left]] == left) m.erase(s[left]);
++left;
}
res = max(res, i - left + 1);
}
return res;
}
};
类似题目
边栏推荐
猜你喜欢

最详解决:jupyter notebook不会自动打开浏览器问题
![[FreeRTOS] 13 Dynamic Memory Management](/img/78/45af1c090cdfe687919432fb91fd28.png)
[FreeRTOS] 13 Dynamic Memory Management

Annual salary of 600,000+?This 100,000-word interview assault book covers all technology stacks from Ali P5 engineers to P7

bp神经网络反向传播原理,BP神经网络反向传播

Embedded Development: Embedded Basics - Mapping Peripherals Using Arrays of Pointers

How to use bitwise operators in C language

超宽带uwb精准定位,厘米级室内定位技术,实时高精度方案应用

注解和反射、持续

家电巨头,不碰儿童生意

聊聊云原生数据平台
随机推荐
找到一个超级神奇,百试百灵的解决 ModuleNotFoundError: No module named xxx 的方法
怎么学自动化测试
【QT VS项目名称修改】
华为-坐标移动
Shanxi: 1 death occurred in a coal mine safety accidents was ordered to halt production
shell中判断文件目录是否存在
router.afterEach()
电力系统潮流【牛顿-拉夫逊法】(4节点、5节点、6节点、9节点)(Matlab代码实现)
leetcode:1013. 将数组分成和相等的三个部分
MySQL的使用演示及操作,MySQL数据字符集的设置
华为-求int型正整数在内存中存储时1的个数
Lua--table操作
分类常用的神经网络模型,深度神经网络主要模型
promise笔记(四)
一文带你彻底拿下a,b两点间等效电阻
FTXUI按键和ROS2 CLI组合使用笔记(turtlesim+teleop)
自助服务知识库是什么?
神经网络全连接层的作用,各种神经网络的优缺点
C专家编程 第10章 再论指针 10.8 轻松一下---程序检验的限制
LeetCode-876. Middle of the Linked List