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

题目:有一个首尾相接的字符序列,全部元素已大写字符表示,要求截取一段包含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;
	   }

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

你可能感兴趣的:(LT笔记)