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;
    }

     

  • 相关阅读:
    C# NAudio 变声
    初探Protostuff的使用
    CentOS7 配置阿里云yum源,非常之简单
    javacv 视频增加视频(画中画)
    抓包调试fiddler
    CentOS7 手动编译升级GCC至9.3.0
    C# CefSharp 新版本(83 以后版本) 如何在js中直接调用c#类
    毕业设计——驾驶证理论考试系统的设计与实现 2022年1月2日20:35:14
    送餐机器人乐动雷达记录
    linux下拉取git代码
  • 原文地址:https://www.cnblogs.com/zcy19990813/p/9702757.html
Copyright © 2011-2022 走看看