首尾相接的字符序列,返回包含某子串的最短长度

题目:有一个首尾相接的字符序列,全部元素已大写字符表示,要求截取一段包含ABCDE的连续子串,返回这一子串的最短长度,例如ABCYDYE,返回6,ATTMBQECPD返回7.

思路都在方法中了,有什么不明白的可以留言

	public static int method(String str) {
		   //ABCYDYEABCYDYE
		   String str2 = str + str;//将字符串再拼接一次,相当于首尾相接
		   ArrayList<Character> temparr = new ArrayList<Character>();//存放要去找的五个字符
		   temparr.add('A');
		   temparr.add('B');
		   temparr.add('C');
		   temparr.add('D');
		   temparr.add('E');
		   
		   ArrayList<Integer> arr = new ArrayList<Integer>();//用来存那五个字符对应的index
		   HashMap<Character,Integer> set = new HashMap<Character,Integer>();//用来存放当前已经存了那些字符
		   int min = 0;//最小值
		   for(int i = 0; i < str2.length(); i++) { 
			   
			   //如果没有存过当前字符并又是ABCDE中的一个
			   if(!set.containsKey(str2.charAt(i)) && temparr.contains(str2.charAt(i))) {
				  arr.add(i);//就存进去
				  set.put(str2.charAt(i),i);//然后把字符对应的index存进去
			   }else if(set.containsKey(str2.charAt(i)) && temparr.contains(str2.charAt(i))) {
				  //如果已经存过了,就把原来的那个值(是对应字符存的index删掉哦)
				  arr.remove(set.get(str2.charAt(i)));
				  arr.add(i);//再把当前index加上
				  set.put(str2.charAt(i),i);//将当前字符和对应index存入
			   }
			   //这个就不用多说了吧
			   if(arr.size() == 5) {
				  int count = arr.get(4) - arr.get(0);
				  if(count <= min || min == 0) {
					  min = count;
				  }
			   }
		   }
		   return min == 0 ? 0 : min + 1;
	   }

代码也许还能优化,如果有更好的办法或者节省空间的办法,欢迎留言讨论哟

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值