CodeForces 888C K-Dominant Character(模拟)

You are given a string s consisting of lowercase Latin letters. Character c is called k-dominant iff each substring of s with length at least k contains this character c.

You have to find minimum k such that there exists at least one k-dominant character.

Input
The first line contains string s consisting of lowercase Latin letters (1 ≤ |s| ≤ 100000).

Output
Print one number — the minimum value of k such that there exists at least one k-dominant character.

Example
Input
abacaba
Output
2
Input
zzzzz
Output
1
Input
abcde
Output
3

题意:

任意长度至少为k的子串包含有相同的字母。

题解:

从a到z找一遍就好了,寻找同一字母在序列中出现的最大的间隔,最后取间隔最小的字母。

自己写的虽然过了,感觉代码写的很烂。

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        int last[26];
        int a[26]={0},len=s.length();
        memset(last,-1,sizeof(last));
        for(int i=0;i<len;i++)
        {
            int t=s[i]-'a';
            if(last[t]==-1)
            {
                a[t]=i+1;
                last[t]=i;
            }
            else
            {
                a[t]=max(a[t],i-last[t]);
                last[t]=i;
            }
        }
        int ans=100000;
        for(int i=0;i<26;i++)//处理到字符串结尾的间隔
        {           
            if(last[i]!=-1)
            {
                a[i]=max(a[i],len-last[i]);
                ans=min(ans,a[i]);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

参考别人重新写的

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        int ans=1e6;
        for(int i='a';i<='z';i++)
        {
            int t=0,k=0;
            for(int j=0;j<s.length();j++)
            {
                if(s[j]==i)
                    t=0;
                else
                    t++;
                k=max(k,t);
            }
            ans=min(ans,k);
        }
        cout<<ans+1<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/orion7/p/7899926.html