题目:有一个首尾相接的字符序列,全部元素已大写字符表示,要求截取一段包含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;
}
代码也许还能优化,如果有更好的办法或者节省空间的办法,欢迎留言讨论哟