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.
The first line contains string s consisting of lowercase Latin letters (1 ≤ |s| ≤ 100000).
Print one number — the minimum value of k such that there exists at least one k-dominant character.
abacaba
2
zzzzz
1
abcde
3
给一个字符串,找最短每几个字符都会出现一个字符X(X不确定)。
思路:找到每个同一字符相距最远的长度d,则此字符为每d个长度的字符串都出现的字符,再找最小的d。需要注意的是求得d还要考虑第一个字符距离开始0的位置,和最后一个此字符距离结束n的位置。情况考虑不全wrong好几次
#include<bits/stdc++.h>
using namespace std;
char s[100010];
map<char,int>q;
map<char,int>m;
map<char,int>w;
int main()
{
scanf("%s",s+1);
int l=strlen(s+1);
q.clear();
m.clear();
w.clear();
if(l==1)
{
printf("1\n");
return 0;
}
for(int i=l;i>=0;i--)
w[s[i]]=i;
for(int i=1;i<=l;i++)
{
if(m[s[i]]!=0)
q[s[i]]=max(q[s[i]],i-m[s[i]]);
m[s[i]]=i;
}
int ans=100000000;
for(int i=1;i<=l;i++)
{
if(q[s[i]]!=0)
{
q[s[i]]=max(q[s[i]],l-m[s[i]]+1);
q[s[i]]=max(q[s[i]],w[s[i]]);
if(q[s[i]]<ans)
ans=q[s[i]];
}
}
int p=l/2+1;
if(ans==100000000)
ans=l/2+(l/2==0?0:1);
printf("%d\n",min(p,ans));
}

本文介绍了一种算法,用于寻找给定字符串中最短长度的子串,确保至少包含一种k-主导字符。通过分析字符间的最大间隔来确定这一长度。
309

被折叠的 条评论
为什么被折叠?



