当前位置:网站首页>leetcode:340.至多包含K个不同字符的最长子串
leetcode:340.至多包含K个不同字符的最长子串
2022-08-10 16:39:00 【OceanStar的学习笔记】
题目来源
题目描述
题目描述:给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T。
示例 1:
输入: s = “eceba”, k = 2
输出: 3
解释: 则 T 为 “ece”,所以长度为 3。
示例 2:
输入: s = “aa”, k = 1
输出: 2
解释: 则 T 为 “aa”,所以长度为 2。
class Solution {
public:
int lengthOfLongestSubstringKDistinct(string s, int k) {
std::map<char, int> map;
int left = 0, right =
}
};
题目解析
因为本题具有单调性(指针向前,种类不可能减少),所以可以用滑动窗口来做
实现
哈希表,key是字符,value是窗口内字符出现的次数。
所以m.size()就是窗口内出现的字符种类个数
class Solution {
public:
int lengthOfLongestSubstringKDistinct(string s, int k) {
int ans = 0, left = 0;
std::unordered_map<char, int> m;
for (int i = 0; i < s.size(); ++i) {
++m[s[i]];
while (m.size() > k){
if(--m[s.size()] == 0){
m.erase(s[left]);
}
++left;
}
ans = std::max(ans, i - left + 1);
}
return ans;
}
};
实现
class Solution {
public:
int lengthOfLongestSubstringKDistinct(string s, int k) {
if(k == 0){
return 0;
}
int ans = 0;
int N = s.size();
std::vector<int> count(256);
int diff = 0;
int R = 0;
for (int i = 0; i < N; ++i) {
// R 窗口的右边界
while (R < N && (diff < k || (diff == k && count[s[R]] > 0))) {
//窗口内字符种类<k个 || 窗口内字符种类==k个&&边界字符之前出现过
diff += count[s[R]] == 0 ? 1 : 0;
count[s[R++]]++;
}
// R 来到违规的第一个位置
ans = std::max(ans, R - i);
diff -= count[s[i]] == 1 ? 1 : 0;
count[s[i]]--;
}
return ans;
}
};
类似题目
边栏推荐
猜你喜欢
随机推荐
C语言按位运算符如何使用
【科研】常见火灾数据集
Gif动图如何快速制作?教你1分钟图片合成gif的方法
64位 RT-Thread 移植到 Cortex-A53 系统 bug 修复笔记
不同主机收不到组播消息原因分析
LeetCode-922. Sort Array By Parity II
Go+:首个顺应 “三位一体” 发展潮流的编程语言
C:枚举的优缺
一种新的测试方法:视觉感知测试
C语言各种符号如何使用
Bitwarden:免费、开源的密码管理服务
【硬件架构的艺术】学习笔记(4)流水线的艺术
Lua--table操作
华为-求int型正整数在内存中存储时1的个数
本地导入不报错,服务器端报错 No module named xxx
神经网络如何提高准确率,神经网络的求解方式
Quicker+沙拉查词使用
LeetCode-692. Top K Frequent Words
Embedded Development: Embedded Basics - Mapping Peripherals Using Arrays of Pointers
FTXUI基础笔记(botton按钮组件进阶)