1. 程式人生 > >[尺取法] hiho字串

[尺取法] hiho字串

如果一個字串恰好包含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;
}