其他分享
首页 > 其他分享> > 【尺取法例题1】hiho字符串

【尺取法例题1】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。

输入:hihio

输出:-1

 

思路:

 尺取法,扫描原始字符串,如果检测到关键字,如果找到所有关键字且恰好是所要求个数的关键字,满足小于最小长度,就更新最小长度;

否则就i停下,j第一次从i+1开始,同上操作,如果没有找到关键字就j继续从上次的走。

 

完整代码:

import java.util.Scanner;
public class CopyOfhiho字符串1485 {

    public static void main(String[] args) {
//        String s1="hhio";
//        String s1="qoihateher";
        Scanner sc=new Scanner(System.in);
        String s1=sc.next();
        char[] arr=s1.toCharArray();
        solve(arr);
        
    }

      public static void solve(char[] arr) {
          
            int j=-1;
         
            int minlength=Integer.MAX_VALUE;
            for (int i = 0; i < arr.length; i++) {
                char c=arr[i];
                if(check(c)){
                    //i处是一个关键字
                    if(j<arr.length && j>=i &&containsAll(arr, i, j)){//所有关键词全部找到
                        if(check(arr,i,j)&&minlength>j-i+1){
                            minlength=j-i+1;
                        }
                        continue;
                    }
                }else{
                    continue;//继续下一次的循环,i++
                }
                if(j==-1)
                    j=i+1;
                while(j<arr.length){
                        char c2=arr[j];
                        
                        if(check(c2)){
                            //j处是一个关键字
                            if(check(arr,i,j)&&containsAll(arr, i, j)){//所有关键词全部找到
                                if(minlength>j-i+1){
                                    minlength=j-i+1;
                                }
                                break;//退出循环,继续执行循环外的语句
                            
                            }else{//还没找到左右,j继续走
                                j++;
                                }
                            
                        }else{
                            j++;
                            }
                            
                        }
            }
        System.out.println(minlength==Integer.MAX_VALUE?-1:minlength);
    }
/**
 * 检查arr[i,j]序列中是否包含所有的关键字
 * @param arr
 * @param i
 * @param j
 * @return
 */
    private static boolean containsAll(char []arr, int i, int j) {
        int c1=0,c2=0,c3=0;
        for (int k = i; k <= j; k++) {
            char key=arr[k];
            if(key=='h')c1++;
            if(key=='i')c2++;
            if(key=='o')c3++;
            
        }
        return c1>=2&&c2>=1&&c3>=1;        
    }
/**
 * 判断arr[i,j]序列是否恰好包含俩个h,一个i,一个o
 * @param arr
 * @param i
 * @param j
 * @return
 */
    private static boolean check(char[] arr, int i, int j) {
        int c1=0,c2=0,c3=0;
        for (int k = i; k <= j; k++) {
            char key=arr[k];
            if(key=='h')c1++;
            if(key=='i')c2++;
            if(key=='o')c3++;
            
        }
        return c1==2&&c2==1&&c3==1;
    }

    private static boolean check(char key) {
        if(key=='h'||key=='i'||key=='o')
            return true;
        
        return false;
    }

}
尺取法

 

标签:arr,int,minlength,param,取法,字符串,hiho,例题
来源: https://www.cnblogs.com/dfglind/p/14347116.html