关于#k#的问题,如何解决?(语言-c++)

给定一个字符串,给定一个数字k,找这个字符串里的最大子串的长度,子串满足的条件是:里面的每一个出现过的字母都出现了至少k次
样例输入

aaabb 3

样例输出 3

思路我都没想出来,帮个忙行吗

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7450703
  • 你也可以参考下这篇文章:C/C++链表的基本操作(新建,输出,删除,插入,查找,逆序,排序,释放链表,链表长度计算,查找倒数第k节点的元素)
  • 您还可以看一下 朱有鹏老师的朱老师C++课程第3部分3.4.模板特化与类型萃取课程中的 3.4.1.从案例中理解什么是模板特化1小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案

    根据题目描述和思考的解决思路,我们可以用以下代码解决这个问题:

    #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;
    
}

img