395——至少有K个重复字符的最长子串
残疾人康复训练
题目:
给你一个字符串 s
和一个整数 k
,请你找出 s
中的最长子串, 要求该子串中的每一字符出现次数都不少于 k
。返回这一子串的长度。
解题尝试
最开始的时候一头雾水(因为我是残疾人)
求子串的问题,在我看来,最难的地方就是时间复杂度
因为随着字符串长度的增加,全部字串的数量是呈指数级别上升的,因此所有基于枚举所有字串的暴力算法必定会超时
因为太久没有写这种题目,用的又是陌生的C++,我决定看一下评论区
在看完评论区后,我写出了第一版的代码
class Solution
{
public:
int longestSubstring(string s, int k)
{
/*
方法一:使用分治的方法
求最长子串,即求每一个满足条件的子串的长度,然后返回最大的子串
其中,每一个子串又可以当作主串进行分解,直至分解出空串,结束
*/
// 若为空串,返回
if (s.length() == 0)
return 0;
// 接下来记录当前字符串的字符出现的次数
vector<int> count(26, 0); // 26个小写字母
for (int i = 0; i < s.length(); i ++)
count[s[i] - 'a'] ++;
// 然后判断当前的字符串是否为满足条件的字符串
int pos = 0;
while (pos < s.length() && count[s[pos] - 'a'] >= k)
pos ++;
// pos == 0,说明整个字符串没有一个字符出现次数大于等于k
// pos == s.length,说明完全满足条件
if (pos == s.length() || pos == 0)