题解 | #最长重复子串#
最长重复子串
http://www.nowcoder.com/practice/4fe306a84f084c249e4afad5edf889cc
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param a string字符串 待计算字符串
* @return int整型
*/
public int solve (String a) {
// write code here
if(a == null || a.length() <= 1){
return 0;
}
char[] data = a.toCharArray();
int length = data.length;
//最大的重复子串就是 字符串一半的长度
int maxLen = data.length / 2;
//
for(int i = maxLen ; i>= 1 ; i--){
//窗口大小 刚开始窗口大小是maxLen 字符串一半长度
//然后缩小窗口比较
//0....maxLen-1 与 maxLen .... 2*maxLen-1 比较
//上面不一样,然后在 1...maxLen-1, 与 maxLen ... 2*maxLen-1比较
//不断将窗口右移动
//都不行再讲窗口缩小一步,然后从左到右移动比较窗口内的字符
//下面的for循环是控制窗口右移比较的 i 是窗口大小,j是控制窗口不断右移
for(int j = 0; j<= length - i - i; j++){
if(check(data,j, i)){
return 2 * i;
}
}
}
return 0;
}
//窗口start ... len -1 ,和len ...start+len
//windowSize , 窗口1 位置i 对应窗口位置 i + windowSize
private boolean check(char[] data, int start ,int windowSize){
for(int i = start ;i < start +windowSize; i++){
if(data[i] != data[i+windowSize]){
return false;
}
}
return true;
}
}