链接 :
Problem - C - Codeforces
题意 :
输入一个长度 ≤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;
}