wangshengjun

题目传送门:https://www.luogu.org/problemnew/show/T37537

题目背景

大家都知道,夜刀神十香ღ是公主殿下手下的元老级大骑士,然而公主招募的保护自己的大骑士,肯定是要具备颜值和智商的。当年公主殿下就出了一道题目考验了他。

题目描述

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

输入输出格式

输入格式:

 

第1行,1个字符串。

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
输出样例#1: 复制
28

说明

字符串的长度 <= 100000;

 


 

 

思路:

       这道题用到了尺取法(双指针),

    一个数( l )记录区间的开始,一个数( r )记录末尾,

    先移动末尾( r ),满足条件后移动开始(缩小区间,就是那个while循环)

    所以每次让 r 右移,如果最左边的出现过就让( l )右移,

    如果得到了 值= 26 就可以更新答案。

    

    题目有点绕,不过也没事。

              这是一道字符串,尺取法的题目。。。。。

    哦,突然忘了~~~~~

    如果答案是等于初始值的,那么输出“No Solution” (引号不用输出)

    那么——输出答案!!

       不加No Solution 很惨 才 56 % 

       如测评记录:https://www.luogu.org/record/show?rid=14248956

       加上大变样!AC了! 100%

   如测评记录:https://www.luogu.org/record/show?rid=14249037

  代码需要注意细节!!!!!!!

   虽然string 慢,但我喜欢啊!!!

放代码:

    


#include <bits/stdc++.h>
#define N 1000010
#define INF 0x3f3f3f3f
using namespace std;
int main()
{
    int i,l=0,ans=INF;
    int vis[200]={0};
    string s;
    set<char>myset;
    cin>>s;
    for(i=0;s[i];i++)
    {
        myset.insert(s[i]);
        vis[s[i]]++;
        while(vis[s[l]]>1)
            vis[s[l]]--,l++;
        if(myset.size()==26)
            ans=min(ans,i-l+1);
    }
    if(ans==0x3f3f3f3f)cout<<"No Solution"<<endl;
    else cout<<ans<<endl;
    return 0;
}

  


 

  

 

             

OVER!

相关文章: