题意:告诉你一个字符串,每一个字母都要有一个人守卫,如果字母没有了,那么守卫可以去保护下一个字母,问,当前守卫数量能不能保证,所有的字母都被保护。
思路:记录下到每一个字母所需要的最大守卫数量。 如果当前字母出现过了,并且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;
}