G-eli题解报告

eli和字符串

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

简单的队列模拟

首先把每一个字母加入队列,我们用head,tail表示队列的头和尾
head是头的后一位,tail是尾
那么目前所查找的区间长度为tail-head+1, tail=head+1时队列为空
我们先不断地加入字母(按顺序)
直到其中出现重复的k个字母,这时候就要把头缩回来(++head),直到头是这个字母为止,那么我们认为以这个字母为头和尾的字串是目前查找的最短的字串
那么在头缩进去的时候,会失去一些其他的字母,但很明显,目前来看的队列长度是len,而这些字母为首能组成的k个字母重复的字串明显是>len的,而以当前字母为尾的k个重复的字串还在缩头过程中,必定<len
重复做这些操作,比较最大值即可

贴上蒟蒻代码:

#include<bits/stdc++.h>
#define maxn 200010
#define INF 9999999
using namespace std;

int n,k,ans=INF;
int que[maxn],head=1,tail=0;
int num[30];
string str;

int main(){
    scanf("%d%d",&n,&k);
    cin>>str;
    for(int i=0;i<n;++i){
        int j=int(str[i])-'a'+1;
        que[++tail]=j; 
        num[j]++;
        if(num[j]==k){
            while(head<tail+1){
                if(que[head]==j){
                    ans=min(ans,tail-head+1);
                    --num[j];
                    ++head;
                    break;
                }
                else --num[que[head]],++head;
            }
        }
    }
    if(ans==INF) printf("-1");
    else printf("%d",ans);
    return 0;
}
全部评论
感谢大佬orz 想问为什么我设head是头,tail是尾的后一位就会哇呢,就是初始化head=0,tail=0,每次入队之后tail++,当head==tail的时候为队空。。。救救孩子QwQ
2 回复
分享
发布于 2020-02-04 23:24

相关推荐

11 收藏 评论
分享
牛客网
牛客企业服务