您的位置:首页 > 其它

51Nod 1127 最短的包含字符串 (尺取

2017-04-28 09:41 513 查看
1127 最短的包含字符串

Description

给出一个字符串,求该字符串的一个子串S,S包含A-Z中的全部字母,并且S是所有符合条件的子串中最短的,输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。

Input

第1行,1个字符串。字符串的长度 <= 100000。

Output

输出包含A-Z的最短子串长度。如果没有符合条件的子串,则输出No Solution。

Sample Input

BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ


Sample Output

28

题解:

尺取发 qaq

AC代码

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define ll long long
const int mod = 1e9+7;
#define N 100010
#define inf 0x3f3f3f3f
char str
;
int vis[100];
int main()
{
scanf("%s",str);
int len = strlen(str);
for(int i = 0;i < len; i++) {
if(str[i]>='A'&&str[i]<='Z') {
vis[str[i]-'A']++;
}
}
bool flag = true;
for(int i = 0;i < 26; i++) {
if(vis[i]==0) {
flag = false; break;
}
}
memset(vis,0,sizeof(vis));
int l, r, sum, m = inf;
l = r = sum = 0;
while(r<len || sum==26) {
while(r<len && sum<26) {
if(vis[str[r]-'A']==0) sum++;
vis[str[r]-'A']++;
r++;
}
while(vis[str[l]-'A'] > 1) {
vis[str[l]-'
c0da
A']--;
l++;
}
if(sum == 26) m = min(m,r-l);
sum--;
vis[str[l]-'A']--;
l++;
}
if(flag)
printf("%d\n",m);
else puts("No Solution");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: