基准时间限制:1 秒 空间限制:131072 KB 分值: 20
难度:3级算法题
给出一个字符串,求该字符串的一个子串S,S包含A-Z中的全部字母,并且S是所有符合条件的子串中最短的,输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。
Input
第1行,1个字符串。字符串的长度 <= 100000。
Output
输出包含A-Z的最短子串长度。如果没有符合条件的子串,则输出No Solution。
Input示例
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
Output示例
28
思路:
1、校赛打完了好开森,水一道题准备休息了。
2、尺取法即可,维护两个指针,分别表示窗口的左端点和窗口的右端点,对应一个窗口内每次都维护最小长度。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int vis[500];
char a[1000500];
int main()
{
while(~scanf("%s",a))
{
memset(vis,0,sizeof(vis));
int n=strlen(a);
int ss=0;
int sum=0;
int output=0x3f3f3f3f;
int j=0;
while(j<n)
{
if(sum<26)
{
vis[a[j]]++;
if(vis[a[j]]==1)
{
sum++;
}
}
j++;
if(sum==26)
{
output=min(output,j-ss);
while(sum==26)
{
vis[a[ss]]--;
if(vis[a[ss]]==0)
{
sum--;
}
output=min(output,j-ss);
ss++;
}
}
}
if(output==0x3f3f3f3f)printf("No Solution\n");
else
printf("%d\n",output);
}
}
本文介绍了一种使用尺取法解决最短包含字符串问题的方法,旨在寻找覆盖所有A-Z字母的最短子串。通过维护两个指针来不断调整窗口大小,确保窗口内包含所有指定字符的同时尽可能减小其长度。
4万+

被折叠的 条评论
为什么被折叠?



