给定一个字符串,给定一个数字k,找这个字符串里的最大子串的长度,子串满足的条件是:里面的每一个出现过的字母都出现了至少k次
样例输入
aaabb 3
样例输出 3
思路我都没想出来,帮个忙行吗
根据题目描述和思考的解决思路,我们可以用以下代码解决这个问题:
#include <iostream>
#include <unordered_map>
using namespace std;
int longestSubstring(string s, int k) {
int result = 0;
unordered_map<char, int> countMap;
for (int i = 0; i < s.length(); i++) {
countMap.clear(); // 每次处理一个新字符时清空哈希表
for (int j = i; j < s.length(); j++) {
countMap[s[j]]++;
bool isValid = true;
for (auto it = countMap.begin(); it != countMap.end(); it++) {
if (it->second < k) {
isValid = false;
break;
}
}
if (isValid) {
result = max(result, j - i + 1);
}
}
}
return result;
}
int main() {
string s = "abbcdddefg";
int k = 2;
int result = longestSubstring(s, k);
cout << result << endl;
return 0;
}
代码的解释如下: 1. int longestSubstring(string s, int k)
:定义一个函数longestSubstring
,参数为字符串s
和数字k
,返回值为最大子串的长度。 2. unordered_map<char, int> countMap
:创建一个哈希表countMap
,用于记录字符出现的次数。 3. for (int i = 0; i < s.length(); i++)
:遍历字符串中的每个字符,作为子串的起始位置。 4. countMap.clear()
:每次处理一个新字符时清空哈希表。 5. for (int j = i; j < s.length(); j++)
:从起始位置开始,遍历字符串中的每个字符,作为子串的结束位置。 6. countMap[s[j]]++
:将当前字符加入哈希表,并更新其出现的次数。 7. bool isValid = true
:定义一个变量isValid
,表示子串是否满足条件。 8. for (auto it = countMap.begin(); it != countMap.end(); it++)
:遍历哈希表中的每个字符和次数。 9. if (it->second < k)
:如果有字符出现次数小于k
,则将isValid
设为false
。 10. result = max(result, j - i + 1)
:如果当前子串满足条件,更新最大子串的长度。 11. return result
:返回最大子串的长度。
通过运行上述代码,可以得到最终的输出结果为3
,即字符串"abbcdddefg"中满足条件的最大子串长度为3
。
希望以上解决方案对你有所帮助!如果还有其他问题,请继续提问。
我的思路是:
1、首先,获取一个字符串和一个数字k;
2、然后,遍历这个字符串,记录每一个子串的长度,存入数量数组;
3、接着,遍历数量数组,找出大于等于数字k的最大长度;
4、最后,输出最大长度。
代码如下:
#include <stdio.h>
int main(void){
char str[256];
int k;
int lens[52]={0}; // 记录字母出现次数的数量数组
// 从输入获取一个字符串和 一个数字
scanf("%s%d",str,&k);
int i=0;
int j=0;
char pre=str[0]; // 前置字符初始赋值为字符串第一个字符
while(str[i]!='\0'){
// 如果前置字符等于字符串当前字符
// 则当前字符数量+1
if(pre==str[i]){
lens[j]++;
}else{ // 如果前置字符和当前字符不同
j++; // 则指向数量数组下一个元素
lens[j]++; // 当前字符数量+1
}
pre=str[i]; // 前置字符更新为当前字符
i++; // 指向字符数组下一个元素下标
}
// for(i=0;i<=j;i++){
// printf("%d ",lens[i]);
// }
// printf("\n");
int max=0;// 最长子串长度初始赋值为0
i=0;
while(i<=j){
if(lens[i]>=k){ // 如果当前字符数量 大于等于k
// 并且大于原来的最长长度。则将当前长度赋值给最大长度
if(lens[i]>max){
max=lens[i];
}
}
i++;
}
// 输出结果
printf("%d",max);
return 0;
}