题意:告诉你一个字符串,每一个字母都要有一个人守卫,如果字母没有了,那么守卫可以去保护下一个字母,问,当前守卫数量能不能保证,所有的字母都被保护。

思路:记录下到每一个字母所需要的最大守卫数量。 如果当前字母出现过了,并且cnt不为0,那么cnt–。 如果当前字母没出现过,那么ans++; 如果出现过的字母, cnt==0了,ans–;

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+500;
char str[maxn];
int cnt[1000];
bool vis[1000];
int main(void)
{
    memset(vis,false,sizeof(vis));
    memset(cnt,0,sizeof(cnt));
    int k,n;
    cin >> n >> k;
    scanf("%s",str+1);
    for(int i=1;i<=n;i++)
        cnt[str[i]]++;
    int ans=0;
    int maxx=-1;
    for(int i=1;i<=n;i++)
    {
        if(vis[str[i]]==false)
            cnt[str[i]]--,vis[str[i]]=true,ans++;
        else if(vis[str[i]]==true)  cnt[str[i]]--;
        maxx=max(maxx,ans);
        //printf("ans=%d\n",ans);
        if(cnt[str[i]]==0)  ans--; // 如果当前字母为0,那么需要的守卫数量-1
    }
    if(maxx>k)
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}