1、寻找最长重复子字符串索引,比如:String s = "acbbbb"; 返回索引为2。
//寻找最长重复字符串 public static int selectINdex(String str){ int start = 0,end = 1,maxStart = 0,maxEnd = 1; char[] chars = str.toCharArray(); for (int i = 1; i < chars.length; i++) { if(chars[i-1] != chars[i]){ end = i; int len = end-start; if(len>maxEnd-maxStart){ maxStart = start; maxEnd = end; } //重新计算开始位置 start = end; } } //返回真实索引 return start; }
2、寻找最长无重复子字符串
public static int length(String s){ if(s.length()==0){ return 0; } HashMap<Character,Integer> map = new HashMap<>(); int max = 0; //最长字串左边界 int left = 0; for (int i = 0; i <s.length() ; i++) { if(map.containsKey(s.charAt(i))){ // 后面为什么要加1?因为如果map包含此字母,说明之前出现过,所以这次出现的位置应该是之前的位置加1,相当于去掉第一次出现的该字母,再和left比较,取较大的 left = Math.max(left,map.get(s.charAt(i))+1); } //记录第i个元素的位置 map.put(s.charAt(i),i); max = Math.max(max,i-left+1); } return max; }