• 最短的包含字符串 (尺取法)


    给出一个字符串,求该字符串的一个子串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;
    }

     

  • 相关阅读:
    Java 线程池原理分析
    基于 Java NIO 实现简单的 HTTP 服务器
    Java NIO之选择器
    Java NIO之套接字通道
    Django【基础篇-1】
    paramiko_sftp封装
    python random模块生成随机验证码
    Python3 os与sys模块用法
    python生成器并行实例
    python装饰器无参及有参案例
  • 原文地址:https://www.cnblogs.com/zcy19990813/p/9702757.html
Copyright © 2020-2023  润新知