字符串_1

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/82288713