hiho字符串

如果一个字符串恰好包含2个'h'、1个'i'和1个'o',我们就称这个字符串是hiho字符串。  

例如"oihateher"、"hugeinputhugeoutput"都是hiho字符串。

现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个。

Input

字符串S  

对于80%的数据,S的长度不超过1000  

对于100%的数据,S的长度不超过100000

Output

找到S的所有子串中,最短的hiho字符串是哪个,输出该子串的长度。如果S的子串中没有hiho字符串,输出-1。

Sample Input
happyhahaiohell
Sample Output
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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值