最長公共子串問題 矩陣法求解

2021-09-11 20:13:13 字數 878 閱讀 3666

最大公共子串長度問題就是: 求兩個串的所有子串中能夠匹配上的最大長度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。

『演算法思路』

1、把兩個字串分別以行和列組成乙個二維矩陣。

2、比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。

3、通過查詢出值為1的最長對角線就能找到最長公共子串。

針對於上面的兩個字串我們可以得到的二維矩陣如下:

從上圖可以看到,str1和str2共有5個公共子串,但最長的公共子串長度為5。

為了進一步優化演算法的效率,我們可以再計算某個二維矩陣的值的時候順便計算出來當前最長的公共子串的長度,即某個二維矩陣元素的值由record[i][j]=1演變為record[i][j]=1 +record[i-1][j-1],這樣就避免了後續查詢對角線長度的操作了。修改後的二維矩陣如下:

最長公共子串問題

給定兩個字串str1和str2,返回兩個字串的最長公共子串。要求時間複雜度為o m n 額外空間複雜度為o 1 的方法。一開始想用kmp演算法解決此題,但是眾所周知kmp演算法需要next陣列,那麼空間複雜度肯定是o n 了。後來想到了遞迴的方法。剛好滿足題目的要求。public string th...

最長公共子串問題

給出兩個字串,求這兩個字串的公共子串。還有乙個類似的問題是兩字串的公共子串行,有待分析 例子 input abcdefg gdefacd output def使用動態規劃法,相當於用空間換時間。將乙個複雜的大問題,分解為較為簡單的子問題,最重要的步驟就是推導狀態轉移公式。現有兩個字串,x x1,x2...

最長公共子串 LCS 的求解

大致概念看鏈結 最長公共子串的矩陣追蹤技術 includeusing namespace std const int maxn 100 int lcs maxn maxn 構建lcs追蹤矩陣 string str1,str2 string ans int lcs int n,int m else e...