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