牛客挑戰賽23-A.字串(尺取)
小N現在有一個字串S。他把這這個字串的所有子串都挑了出來。一個S的子串T是合法的,當且僅當T中包含了所有的小寫字母。小N希望知道所有的合法的S的子串中,長度最短是多少。
輸入描述:
一行一個字串S。只包含小寫字母。S的長度不超過106.
輸出描述:
一行一個數字,代表最短長度。資料保證存在一個合法的S的子串。
示例1
輸入
ykjygvedtysvyymzfizzwkjamefxjnrnphqwnfhrnbhwjhqcgqnplodeestu
輸出
49
思路:看了一眼題目,大致想了一下,沒有動手寫,大概是2個指標標記,一個在前標記種類,到達26種便停下,因為後面的就可以不要了。前面的指標,在遇到重複的字元時進行及時更新與前進。然後這個方法居然就是傳說中的尺取法........
程式碼如下:
#include<set>
#include<map>
#include<list>
#include<deque>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<stdio.h>
#include<sstream>
#include<stdlib.h>
#include<string.h>
//#include<ext/rope>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
#define per(i,a,b) for(int i=a;i<=b;++i)
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
#define LL long long
#define swap(a,b) {int t=a;a=b;b=t}
using namespace std;
//using namespace __gnu_cxx;
const int maxn=1e6+7;
int vis[26];
int n,s,k;
int main()
{
string s1;
cin>>s1;
s=0x3f3f3f3f;
int n=s1.size();
per(i,1,n)
{
int t=s1[i-1]-'a';
if(vis[t]==0) k++;//注意,考慮第0個元素vis更新為0的情況
vis[t]=i;
if(k==26)
{
int z=0;
per(j,0,25)
z=max(z,i-vis[j]+1);
s=min(s,z);//不能直接跳出,需要迴圈完每一個子串
}
}
cout<<s;
return 0;
}
相關文章
- 牛客挑戰賽58
- 牛客挑戰賽72 總結
- 牛客周賽48
- 牛客練習賽
- 【牛客訓練記錄】牛客周賽 Round 69
- 【牛客訓練記錄】牛客周賽 Round 70
- 挑選方案問題(牛客競賽 思維題+推導公式)公式
- 牛客小白月賽105
- 牛客周賽 Round 63
- 牛客周賽 Round 57
- 牛客周賽 Round 56
- 牛客小白月賽97
- 牛客小白月賽88
- 牛客周賽 Round 40
- 牛客小白月賽89
- 牛客周賽 Round 47
- 牛客周賽 Round 1
- 牛客周賽 Round 3
- 牛客周賽 Round 7
- 牛客小白月賽94
- 牛客周賽 Round 8
- 牛客周賽Ronud 46
- 牛客周賽 Round 38
- 牛客練習賽60
- 牛客小白周賽9
- 牛客練習賽 26
- 牛客周賽 Round 67 A~F
- 牛客周賽 Round 67 F
- 牛客小白月賽104(A~D)
- 牛客周賽 Round 66 G
- 牛客周賽 Round 65(D)
- 牛客小白月賽100 A~E
- 牛客小白月賽98 A~D
- 牛客小白月賽101 A~E
- 牛客練習賽 71 AC
- 牛客小白月賽3 G
- xss挑戰賽writeup
- 牛客小白月賽105 題解