字符串(dp+思维)

版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/xianpingping/article/details/82285170

链接:https://www.nowcoder.com/acm/contest/161/A
来源:牛客网
 

题目描述

小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的,当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中,长度最短是多少。

输入描述:

一行一个字符串S。只包含小写字母。S的长度不超过106.

输出描述:

一行一个数字,代表最短长度。数据保证存在一个合法的S的子串。

示例1

输入

复制

ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu

输出

复制

48

思路:题目就不多说了。思路就是便找边维护,始终维护最小的。详细见代码

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    int num[40];
    int ans=99999999;
    int i=0,j=0;
    int haha;
    int countt=0;
    memset(num,0,sizeof(num));
    cin>>s;
  ///  cout<<"s.length():"<<s.length()<<endl;
    for(i=0;i<s.length();i++){
        haha=s[i]-'a'+1;
        if(num[haha]==0){
            ++countt;
        }
         num[haha]++;
        while(1){
            haha=s[j]-'a'+1;
            if(num[haha]>=2)
            {
                j++;
                num[haha]--;
            }
            else
                break;
        }
        if(countt==26 ){
           /// cout<<"i:"<<i<<"   j:"<<j<<endl;
            ans=min(ans,i-j+1);
        }
    }
    cout<<ans<<endl;
}
/*
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestuv
*/

猜你喜欢

转载自blog.csdn.net/xianpingping/article/details/82285170