ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【尺取法例题1】hiho字符串

2021-01-29 21:33:45  阅读:233  来源: 互联网

标签:arr int minlength param 取法 字符串 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有