AcWing第26场周赛 4077. k显性字符

4077. k显性字符 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/4080/

 

输入样例1:

abacaba

输出样例1:

2

输入样例2:

zzzzz

输出样例2:

1

输入样例3:

abcde

输出样例3:

3

要求k显性字符串, 我们可以暴力枚举每种字母与其相同的字母相邻间距的最大值

这是可以优化的, 

设置一个长度为26(引射26个英文字母)的数组last[ ]用来表示上一次该字母出现的下标,

最大值就从当前字母与上次它出现的下标的差值 中取

另外需要特判开头和结尾,

若我们让该字符串下标从1开始且last[ ]初始化为0的话, 开头不必特判

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1e5+10, M = 26;
char a[N];
int ch[M], last[N];
int main()
{
    scanf("%s", a+1);
    int n = strlen(a+1);
    
    for(int i = 1; i <= n; i ++)
    {
        int x = a[i]-'a';
        ch[x] = max(ch[x], i-last[x]);
        last[x] = i;
    }
    
    for(int i = 0; i < 26; i ++)
        ch[i] = max(ch[i], n-last[i]+1);
        
    int res = N;
    for(int i = 0; i < 26; i ++)
        res = min(res, ch[i]);
    
    cout << res;
    return 0;
}

原文地址:https://www.cnblogs.com/Knight02/p/15799022.html