1. 程式人生 > >資料結構/最長重複子串

資料結構/最長重複子串

基本方法、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