eli和字符串 (牛客假期训练)

链接:https://ac.nowcoder.com/acm/contest/3002/G
来源:牛客网

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

eli拿到了一个仅由小写字母组成的字符串。
她想截取一段连续子串,这个子串包含至少 个相同的某个字母
她想知道,子串的长度最小值是多少?
注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串“arcaea”而言,“arc”、“rcae”rcae”都是其子串。而car”、aa”则不是它的子串。
 

输入描述:

第一行输入两个正整数 

输入仅有一行,为一个长度为
 的、仅由小写字母组成的字符串。
 

输出描述:

如果无论怎么取都无法满足条件,输出 

否则输出一个正整数,为满足条件的子串长度最小值。
 
示例1

输入

复制
5 2
abeba

输出

复制
3

说明选择“beb”mathit“beb”beb”子串,长度为3,其中包含相同的两个'b'

 解析:给题非常巧妙的用b[t][vis[t]]=i;来记录t字符的出现的次数(vis[t])和他的位置i。
所以距离就变成了:ans=min(ans,i-b[t][vis[t]-k+1]+1);
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map> 
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll; 
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
const int maxn=5e5+10;
int n,k;
char a[maxn];
int b[100][maxn];
int vis[maxn];
int ans=0x3f3f3f3f;
int main(){
    cin>>n>>k;
    scanf("%s",a+1);
    for(int i=1;i<=n;i++){
        int t=a[i]-'a';
        vis[t]++;
        b[t][vis[t]]=i;
        if(vis[t]>=k){
            ans=min(ans,i-b[t][vis[t]-k+1]+1);
        }
    }
    if(ans==0x3f3f3f3f){
        printf("-1
");
    }
    else{
        printf("%d",ans);
    }
}
 
原文地址:https://www.cnblogs.com/lipu123/p/12266514.html