数据结构/最长重复子串

基本方法、KMP算法求解、后缀数组求解

求字符串的最长重复子串

例如:aaaaaaaaabbbbcccaaassscvvv这里面的最长重复子串为aaaaaaaaa

算法思路:算法时间复杂度(O(n))

1. 将这一个字符串先转成char数组;

2. 将这一char数组进行遍历

3. 比较char数组中第i-1个与第i个的字符是否相等,如果不相等则进行截取字符串长度,然后将其进行比较,如果其长度比现有长度大,则进行替换,否则什么也不做

public class LongestRepeatSubstring {
    private static String reSubStr(String str){
        /**
         * 设置变量
         * start:开始
         * end:结束
         * maxStart:最长子串开始位置
         * maxEnd:最长子串结束位置
         */
        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;
                }
                //在上面的if语句里面,所以已经出现不相等了,所以新的start位置为之前的end位置
                start = end;
            }
        }
        //截取字符串
        return str.substring(maxStart,maxEnd);
    }

    public static void main(String[] args) {
        System.out.println(LongestRepeatSubstring.reSubStr("asdsefaaabbbbcdeee"));
    }
}
https://www.cnblogs.com/lonecloud/p/9281875.html
http://dsqiu.iteye.com/blog/1701324

猜你喜欢

转载自blog.csdn.net/fkyyly/article/details/83508168