题目
给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。
题目输入
第一行有一个子串(1<长度<=100),只包含大写字母。
第二行为 k的值
题目输出
输出连续出现次数第k多的字母的次数。
实例
输入 | AAAAHHHBBCDHHHH |
输出 | 2 |
说明 | 同一字母连续出现的最多的是A和H,四次; 第二多的是H,3次,但是H已经存在4个连续的,故不考虑; 下个最长子串是BB,所以最终答案应该输出2。 |
输入 | AABAAA |
输出 | 1 |
说明 | 同一字母连续出现的最多的是A,三次; 第二多的还是A,两次,但A已经存在最大连续次数三次,故不考虑; 下个最长子串是B,所以输出1。 |
输入 | ABC 4 |
输出 | -1 |
说明 | 只含有3个包含同一字母的子串,小于k,输出-1 |
输入 | ABC 2 |
输出 | 1 |
说明 | 三个子串长度均为1,所以此时k = 1,k=2,k=3这三种情况均输出1。特此说明,避免歧义。 |
题目解析
题目
题目代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 双指针
int main(){
string str;
cin >> str;
int k;
cin >> k;
int slow = 0;//慢指针
vector<int> nums(26, 0);
for(int i = 0; i < str.size(); i++){
if(str[slow] != str[i]){
nums[str[slow] - 'A'] = max(nums[str[slow] - 'A'], i - slow);
slow = i;//更新慢指针
}
}
sort(nums.begin(), nums.end(), [](int a, int b){return a > b;});
if(k > 26 || nums[k - 1] == 0){
cout << 0 <<endl;
return 0;
}
cout << nums[k - 1] << endl;
return 0;
}