Problem P06. [算法课分治] 找到 k 个最长重复字符串

image

注意是在该子字符串内每个字符的出现次数都不少于k。可以采用分治的方法,函数找一个不符合条件的字符,然后将字符串分成两个子字符串,就这样进行递归运算,每次找到符合条件的子字符串就判断一波长度,然后将最长的长度值存下来。

#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>

using namespace std;

int k;
char s[10005];
int valmax = 0;

void longestSubstring(int left, int right)
{
    if (left >= right)
    {
        return;
    }
    int letter[30]={0};
    for (int i = left; i < right; i++)
    {
        letter[s[i]-'a']++;
    }
    for (int i = left; i < right; i++)
    {
        if (letter[s[i]-'a']<k)
        {
            longestSubstring(left, i);
            longestSubstring(i+1, right);
            return;
        }
    }
    valmax = max(valmax, right-left);
}

int main()
{
    scanf("%s %d", s, &k);
    longestSubstring(0, strlen(s));
    printf("%d", valmax);
    return 0;
}

posted @ 2024-02-04 09:23  白缺  阅读(5)  评论(0编辑  收藏  举报