[尺取法] hiho字串
阿新 • • 發佈:2018-12-03
如果一個字串恰好包含2個'h'、1個'i'和1個'o',我們就稱這個字串是hiho字串。
例如"oihateher"、"hugeinputhugeoutput"都是hiho字串。
現在給定一個只包含小寫字母的字串S,小Hi想知道S的所有子串中,最短的hiho字串是哪個。
輸入
字串S
對於80%的資料,S的長度不超過1000
對於100%的資料,S的長度不超過100000
輸出
找到S的所有子串中,最短的hiho字串是哪個,輸出該子串的長度。如果S的子串中沒有hiho字串,輸出-1。
樣例輸入
happyhahaiohell
樣例輸出
5
思路:取一個動態空間,裡面得有2個h,一個i,一個o;
i作為指標不斷在前面一直跑,j在最後面一直取,一直讓i與j內部有2個h,一個i,一個o;
每次成立,取最小值。
#include<iostream> #include<cstring> #include<map> #include<cstdio> #include<cmath> using namespace std; map<char ,int > p; int main() { string s; int i,j=0,minx=10000000; cin>>s; for(i=0;s[i];i++) { p[s[i]]++; int temp=0; while(p['h']>=2&&p['i']>=1&&p['o']>=1) { temp=1; p[s[j]]--; j++; } if(temp) { j--; p[s[j]]++; } if(p['h']==2&&p['i']==1&&p['o']==1) { minx=min(i-j+1,minx); } } if(minx==10000000) cout<<-1<<endl; else cout<<minx<<endl; return 0; }