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;
    }
    
}