题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1127

题意:中文题诶~

思路:尺取法

维护一个队列,若当前队首的元素在后面出现了,那么我们就将其删除,若当前队列里含有26个字母,我们就记录其size。

取所有size里面的最小值就是我们要的答案。。。

代码:

 #include <iostream>
#include <stdio.h>
#include <string>
#include <queue>
#include <string.h>
#define MAXNV 30
#define MAXNA 100010
using namespace std; int vis[MAXNV];
char a[MAXNA]; int main(void){
int value=, ans=MAXNA;
queue<char> q;
scanf("%s", a);
int len=strlen(a);
for(int i=; i<len; i++){
q.push(a[i]);
if(!vis[a[i]-'A']){
value++;
}
vis[a[i]-'A']++;
while(vis[q.front()-'A']>=){
vis[q.front()-'A']--;
q.pop();
}
if(value>=){
int gg=q.size();
ans=min(ans, gg);
}
}
if(value<){
cout << "No Solution" << endl;
}else{
cout << ans << endl;
}
return ;
}
05-28 23:44