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中的位置和...