CF701C:尺取法

CF701C

题意:

  • 最短的子串包含字符串所有种类的字母。

题解:

  • 先找出所包含的字母的种类。然后尺取法。

代码

#include <bits/stdc++.h>
using namespace std;
int const N = 100000 + 10;
int const M = 60;
int n,vis[M];
char s[N];
int main(){
	scanf("%d",&n);
	scanf(" %s",s);
	int len = strlen(s);
	int type = 0;
	for(int i=0;i<len;i++)
		if(++vis[s[i]-'A'] == 1)	type++;
	memset(vis,0,sizeof(vis));
	int cnt = 0,ans = N,st = 0;
	for(int i=0;i<len;i++){
		if(++vis[s[i]-'A'] == 1)	cnt++;
		while(cnt == type && st <= i){
			ans = min(ans,i - st + 1);
			if(--vis[s[st]-'A'] == 0)	cnt--;
			st++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

 

 

猜你喜欢

转载自blog.csdn.net/weixin_42264485/article/details/88826767
今日推荐