zoukankan      html  css  js  c++  java
  • 最短的包含字符串 (尺取法)

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

    Input

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

    Output

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

    Sample Input

    BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ

    Sample Output

    28
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    char a[100100];
    int flag[26];
    int yang()
    {
        int i;
        for(i=0;i<26;i++)
        {
            if(flag[i]==0)
                break;
        }
        if(i>=26)
            return 1;
        else
            return 0;
    }
    int main()
    {
        int l=0,r=0,sum=0,n=0,p=0,i;
        memset(a,0,sizeof(a));
        gets(a);
        n=strlen(a);
        sum=n+1;
        if(n<26)
            printf("No Solution
    ");
        else
        {
            for(i=0;i<26;i++)
              flag[a[i]-65]++;
            p=yang();
            if(p==1&&n==26)
            {
                printf("26
    ");
                return 0;
            }
            r=26;
            for(i=26;i<n;i++)
            {
                p=yang();
                if(p==0)
                    flag[a[r++]-65]++;
                while(yang())
                {
                    sum=min(r-l,sum);
                    flag[a[l++]-65]--;
                }
    
            }
            if(sum>n)
                printf("No Solution
    ");
            else
                printf("%d
    ",sum);
        }
        return 0;
    }

     

    改成下面的也对(简化版)

    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    char a[100100];
    int flag[26];
    int yang()
    {
        int i;
        for(i=0; i<26; i++)
        {
            if(flag[i]==0)
                break;
        }
        if(i>=26)
            return 1;
        else
            return 0;
    }
    int main()
    {
        int l=0,r=0,sum=0,n=0,p=0,i;
        memset(a,0,sizeof(a));
        gets(a);
        n=strlen(a);
        sum=n+1;
        for(i=0; i<n; i++)
        {
            flag[a[r++]-65]++;
            while(yang())
            {
                sum=min(r-l,sum);
                flag[a[l++]-65]--;
            }
    
        }
        if(sum>n)
            printf("No Solution
    ");
        else
            printf("%d
    ",sum);
    
        return 0;
    }

     

  • 相关阅读:
    mysql_单表查询
    mysql_建表
    MySQL基础
    JS_左边栏菜单
    Vue框架之组件系统
    Vue常用语法及命令
    Django的缓存,序列化,ORM操作的性能
    Django中的form表单
    Django中的auth模块
    AJAX请求提交数据
  • 原文地址:https://www.cnblogs.com/zcy19990813/p/9702757.html
Copyright © 2011-2022 走看看