最長重複子串的演算法

2021-10-14 01:41:42 字數 1628 閱讀 2061

public

class

strtest

private string findsubstrbynxt

(string str)

}/**

* 從maxsubstrlensubinfo中解析出重複的最長子串資訊

*/return str.

substring

(maxpos, maxpos + maxrestrlen);}

private

intcalcnxtarry

(string substrtem)

preindexrestrlen = restrlen;

}return maxrestrlen;

}private

intgetnxt

(int index, string substrtem,

int preindexrestrlen)

/** * 以下的邏輯可以優化:

* 1)記錄前一index對應的preindex_substrlen,substrlen = preindex_substrlen +1 開始迴圈

*/// for(substrlen = index; substrlen > 0; substrlen--)

// }

for(substrlen = preindexrestrlen +

1; substrlen >

0; substrlen--)}

return substrlen;

}/**

* 簡化的三層迴圈

* @param str

* @return

*/private string findlongestsubstring

(string str)

/** * 雙重遍歷,尋找存在的重複子串,並記錄重複子串長度:

* 外重迴圈:兩個子串起始座標的間隔,從(1,len(str)-1)

* 內重迴圈:從源串的起始位置,依次往後遍歷

* 維護找到的最長重複子串的長度以及起始位置。

*/int strlength = str.

length()

;for

(int interval =

1; interval < strlength; interval++)}

}catch

(exception e)

if(substrlen > maxsubstrlen)}}

/** * 構造子串,返回

*/return str.

substring

(maxsubstrpos, maxsubstrpos+maxsubstrlen);}

private

boolean

checkvalid

(string str)

/***

* 原始的三層迴圈

*/private string findsubstr

(string str)}if

(gotflag ==

true)}

return maxsubstr;

}}

最長重複子串

首先這是乙個單字串問題。子字串r 在字串l 中至少出現兩次,則稱r 是l 的重複子串。重複子串又分為可重疊重複子串和不可重疊重複子串。方法 kmp演算法求解 在kmp演算法的關鍵就是求解next陣列,針對next j k,可以得到p 0,1,k 1 p j k,j k 1,j 1 看到p 0,1,k...

最長重複子串

思路 使用字尾陣列解決 分析 1 由於要求最長公共子串行,則需要找到字串的所有子串,即通過產生字串的字尾陣列實現。2 由於要求最長的重複子串,則需要對所有子串進行排序,這樣可以把相同的字串排在一起。3 比較 相鄰字串,找出兩個子串中,相同的字元的個數。注意,對於乙個子串,乙個與其重複最多的字串肯定是...

求最長重複子串 和 最長不重複子串 思路

題目 求任意乙個字串中的所有最長重複字串和所有最長不重複子串 最長不重複子串的解法 設定乙個輔助資料結構 如map 記錄每個字元最後一次出現的位置 遍歷字串中的每個字元,如果在map中沒有出現,則不重複子串的長度 1,並更新最大字串的長度值 如果在map中已經出現過,則更新當前字元在map中的位置和...