4 至少有K个重复字符的最长子串
作者: Turbo时间限制: 1S章节: 递归
问题描述 :
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
示例 1:
输入:
s = "aaabb", k = 3
输出:
3
最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:
s = "ababbc", k = 2
输出:
5
最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。
输入说明 :
首先输入一行字符串,长度小于等于100000。
第二行输入数字k,k的值小于等于100000。
输出说明 :
输出符合条件的子串T的长度
如果没有符合条件的T,则输出0
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int longest(const string& s, int start, int end, int k)
{
if (end< k) return 0;
vector<int> count(26, 0);
// 计算字符串中字母出现的次数
for (int i = start; i < end; ++i)
{
count[s[i] - 'a']++;
}
for (int i = start; i < end; ++i)
{
// 如果字母出现的次数小于k,他不能成为子串一部分
// 我们需要从此位置分成两半,分别递归每一半。
if (count[s[i] - 'a'] < k)
{
int j = i + 1;
while (j < end && count[s[j] - 'a'] < k) j++;
return max(longest(s, start, i, k), longest(s, j, end, k));
}
}
return end - start;
}
int longest(const string& s, int k)
{
return longest(s, 0, s.size(), k);
}
int main()
{
string s;
int k;
getline(cin, s);
cin >> k;
cout << longest(s, k) << endl;
return 0;
}