链接 :
题意 :
输入一个长度 ≤1e5 的字符串 s,只包含小写字母。
找到一个最小的 k,使得所有长度 >= k 的连续子串,有公共字母(这些子串的交集不为空)。
思路 :
就是求每个字母的相邻距离的最大值,然后求这些最大值的最小值;
代码 :
#include<bits/stdc++.h>
using namespace std;
int main(){
string s ; cin >> s;
// 每个字母的最大间隔
int ans = INT_MAX , n = s.size();
map<int,vector<int>> a;
for(int i=0;i<n;i++)
a[(int)(s[i]-'a')].push_back(i);
for(int i=0;i<26;i++){
int len = a[i].size() , ma = 0 ;
a[i].push_back(n);
if(len) ma = a[i][0]+1;
else continue;
for(int j=1;j<=len;j++) ma = max(ma,a[i][j]-a[i][j-1]);
ans = min(ma,ans);// 求最小值
}
cout << ans << endl;
}
代码(优化)
用a来记录每个字母之前出现的位置,b记录每个字母的距离的最大值;
#include<bits/stdc++.h>
using namespace std;
int a[26],b[26];
int main(){
string s ; cin >> s;
for(int i=0;i<26;i++) a[i] = -1;
int ans = INT_MAX , n = s.size();
for(int i=0;i<n;i++){
int t = s[i]-'a';
b[t] = max(i-a[t],b[t]);
a[t] = i;
}
for(int i=0;i<26;i++)
if(a[i]!=-1)
ans = min(ans , max(b[i],n-a[i]));
cout << ans << endl;
}