版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HL_HLHL/article/details/82288713
链接:https://www.nowcoder.com/acm/contest/161/A
来源:牛客网
题目描述
小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。
输入描述:
一行一个字符串S。只包含小写字母。S的长度不超过106.
输出描述:
一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。
输入
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu
输出
49
思路:简单的dp+思维题,
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char s[1000010];
scanf("%s", s);
int len = strlen(s);
int ans = 0x3f3f3f3f;
int flag[30] = { 0 },count=0,j=0;
for (int i = 0; i <len; i++)
{
int haha = s[i] - 'a';
if (flag[haha] == 0)
{
count++;
}
flag[haha]++;//哈希表统计字符串每个字符出现的次数
while (1)
{
haha = s[j] - 'a';
if (flag[haha] >= 2)//如果一个字符串已经出现2次,就判断是否在当前j~i之间的子串范围的开始位置,如果是就j++缩小子串范围
{
j++;
flag[haha]--;
}
else
{
break;
}
}
if (count == 26)//统计已经有了26个不同字符在当前的子串中就动态刷新ans的值
{
if (ans > i - j + 1)
{
ans = i - j + 1;
}
}
}
printf("%d\n", ans);
return 0;
}