如果一个字符串恰好包含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,1个i,1个o的滑动窗口,当不断更新左端点;
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
int f[100]={0};
int main(){
string s;
cin >> s;
int len=s.size();
int j=0, temp=0;
int l=100005;
for(int i=0; i<len; i++){
f[s[i]-'a']++;
temp=0;
while(f['h'-'a']>=2 && f['i'-'a']>=1 && f['o'-'a']>=1){//当h,i,o的个数分别大于2,1,1时所遍历
f[s[j]-'a']--; //的字符串中可能存在目标字符串,此时更新
j++; //更新左端点;
temp=1;
}
if(temp){ //temp==1说明进入了上一个循环,因为跳出循环的条件是
j--; //f['h'-'a']<2 || f['i'-'a']<1 || f['o'-'a']<1;所以将最后s[j]的个数加一;
f[s[j]-'a']++;
}
if(f['h'-'a']==2 && f['i'-'a']==1 && f['o'-'a']==1){//满足条件就更新一下l;
l=min(l, i-j+1);
}
}
if(l==100005) cout << -1 << endl;
else cout << l << endl;
return 0;
}