https://blog.csdn.net/xiaoyi357/article/details/70214367
华为笔试题:
思路:
使用两个指针,两个指针的间隔从1,2,3…依次增大, 同时向右移动两个指针,在移动的过程中判断指针位置的字符是否相同,并记录最长子串的长度。
参考:
public static void main(String[] args) throws Exception {
String str1 = "hellowdhelloko";
String result = getRepeatString(str1);
System.out.println(result);//hello
}
// 求解字符串中的最长重复子串
public static String getRepeatString(String input) {
// 参数检查
if (input == null || input.length() == 0) {
return null;
}
// 重复子串的最长长度
int max = 0;
// 最长重复子串的起始位置
int first = 0;
// 当前重复子串的长度
int k = 0;
for(int i = 1;i<input.length();i++){ //i代表两个指针的距离
for(int j = 0;j<input.length()-i;j++){
//两个指针分别为j和j+i,前面的指针j+i<len
if(input.charAt(j) == input.charAt(j+i)){
k++;
}
else{
k = 0;
}
if(k>max){
max = k;
first = j-max+1;
}
}
}
System.out.println(max);
return max == 0?null:input.substring(first, first+max);
}