9.4 字符串应用---尺取法例题(类似于最短摘要)

(1)题目

(2)分析

注意:题目要求恰好包含2个h,1个i,1个0。即不能多也不能少


import java.util.Scanner;

public class Main {
	/*  
	 * 思路:
	 * 测试数据:happyhahaiohell
	 * */
	
	public static void main(String[] args){
		//1.输入字符串
		Scanner sc = new Scanner(System.in);
		char[] w = sc.next().toCharArray();
		
		//2.遍历字符串
		int min = Integer.MAX_VALUE;//存放当前仅包含2个h、1个i、1个o的最短子串长度
		int j=-1;//子数组的尾坐标
		for(int i=0;i<w.length;i++) {
			char w1 = w[i];
			if(check(w1)) {//该字符合法,找到当前子数组的第一个位置i,接着j向后查找
				if(j==-1) {//j的第一次定位
					j=i+1;
				}
				//从j开始循环,找到合适的子数组
				while(j<w.length) {
					char w2 = w[j];
					if(check(w2) && containAll(w, i, j)) {//如果当前字符合法,并且包含所有字符(出现次数一致),则判断当前子数组是否小于当前最小子数组长度
						if(checkAll(w, i, j) && j-i+1 < min) {
							min = j-i+1;
						}
						break;//完成一次查找,接着查找下一个合法子数组(注意,只要包含2个h、1个i、1个o,就退出,出现次数超了也要退出)
					}
					j++;
				}//while
			}//if
		}//for
		
		//3.输出最小的子数组长度
		System.out.println(min==Integer.MAX_VALUE?-1:min);
	}
	
	//1.判断字符c是不是合法,即是不是h、i或o
	private static boolean check(char c) {
		return c=='h' || c=='i' || c=='o';
	}
	
	//2.判断数组w从下标i到下标j中 是否包含2个h,1个i 和 一个o,不能多也不能少
	private static boolean checkAll(char[] w,int i,int j) {
		int c1=0,c2=0,c3=0;
		for(int k=i;k<=j;k++) {
			if(w[k]=='h') c1++;
			if(w[k]=='i') c2++;
			if(w[k]=='o') c3++;
		}
		return c1==2 && c2==1 && c3==1;
	}
	
	//3.判断数组w从下标i到下标j中 是否包含2个h,1个i 和 一个o,可以超
	private static boolean containAll(char[] w,int i,int j) {
		int c1=0,c2=0,c3=0;
		for(int k=i;k<=j;k++) {
			if(w[k]=='h') c1++;
			if(w[k]=='i') c2++;
			if(w[k]=='o') c3++;
		}
		return c1>=2 && c2>=1 && c3>=1;
	}
}
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值