描述
如果一个字符串恰好包含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
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.next();
int ans=hiho(s);
System.out.println(ans);
}
private static int hiho(String s) {
char[]ss=s.toCharArray();
int min=Integer.MAX_VALUE,j=1;
for(int i=0;i<ss.length;i++) {
char c=ss[i];
if(check(c)) {//i停下
for(;j<ss.length;j++) {
char c2=ss[j];
if(check(c2)&&containsAll(ss,i,j)) {//全部囊括
if(check(ss,i,j)&&j-i+1<min) {
min=j-i+1;
}
break;//j停下
}
}
}
}
min=min==Integer.MAX_VALUE?-1:min;
return min;
}
private static boolean containsAll(char[] ss, int i, int j) {
int c1=0,c2=0,c3=0;
for(int k=i;k<=j;k++) {
if(ss[k]=='h') {
c1++;
}
if(ss[k]=='i') {
c2++;
}
if(ss[k]=='o') {
c3++;
}
}
return c1>=2&&c2>=1&&c3>=1;
}
private static boolean check(char[] ss, int i, int j) {
int c1=0,c2=0,c3=0;
for(int k=i;k<=j;k++) {
if(ss[k]=='h') {
c1++;
}
if(ss[k]=='i') {
c2++;
}
if(ss[k]=='o') {
c3++;
}
}
return c1==2&&c2==1&&c3==1;
}
private static boolean check(char c) {
return c=='h'||c=='i'||c=='o';
}
}