呃 看到就想用邻接表做了

eli和字符串

http://www.nowcoder.com/questionTerminal/a4572dcac7a44174b050930146584f72

用邻接表,将对应字母出现的各个位置存下来。
用cnt[ ]数组存每个字母出现的次数。

如果字母出现的次数小于k 那就直接跳过
如果次数>=k 就对邻接表里所有相邻的k个字母遍历
ans 更新最短距离

#include <bits/stdc++.h> 
using namespace std;
typedef long long ll; 
const int INF = 0x3f3f3f3f;
int n,k,cnt[26];
string s;
vector<int>a[26];
int main(){
    cin>>n>>k;
    cin>>s;
    for(int i=0;i<n;i++){
        cnt[s[i]-'a']++;
        a[s[i]-'a'].push_back(i);
    } 
    int ans=INF,flag=0;
    for(int i=0;i<26;i++){
        if(cnt[i]<k) continue;
        flag=1;
        for(int j=0;j<a[i].size()-(k-1);j++){
            int l=j+k-1;
            ans=min(ans,a[i][l]-a[i][j]+1);
        }
    }
    if(!flag) puts("-1");
    else cout<<ans<<endl;
    return 0;
}
全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务