Wannafly挑戰賽23 A 字串(最短區間長度包含所有的小寫字母)
阿新 • • 發佈:2018-11-02
https://www.nowcoder.com/acm/contest/161/A
題解:
這道題用到了尺取法(雙指標),
一個數( l )記錄區間的開始,一個數( r )記錄末尾,
先移動末尾( r ),滿足條件後移動開始(縮小區間,就是那個while迴圈)
所以每次讓 r 右移,
如果最左邊的出現過就讓( l )右移,
如果得到了 num = 26 就可以更新答案
程式碼如下:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<set> #define maxn 1005 #define INF 0x3f3f3f3f #define MOD 1000000007 #define LL long long #define ev 2.71828182 using namespace std; const double PI=acos(-1.0); const int maxz=2e7+5; string s; int book[maxn]; int main() { ios::sync_with_stdio(false); cin>>s; int len=s.size(); int l,r,num; l=r=num=0; int ans=INF; for(;r<len;r++) { if(book[s[r]]==0) num++; book[s[r]]++; while(book[s[l]]>1) { book[s[l]]--; l++; } if(num==26) ans=min(ans,r-l+1); } cout << ans <<endl; return 0; }