最長公共子串問題

2021-09-19 11:33:52 字數 1250 閱讀 5675

給出兩個字串,求這兩個字串的公共子串。(還有乙個類似的問題是兩字串的公共子串行,有待分析)。

例子:

input:

abcdefg

gdefacd

output:

def

使用動態規劃法,相當於用空間換時間。

將乙個複雜的大問題,分解為較為簡單的子問題,最重要的步驟就是推導狀態轉移公式。

現有兩個字串,x=(x1, x2, …, xm), y=(y1, y2, …, yn)

dp[i][j]代表以x[i-1]字元為結尾和以y[j-1]字元為結尾的公共子串長度。(注意!此設定是子串的結尾必須是x[i-1]和y[j-1])。容易推導,當x[i-1] == y[j-1]時,dp[i][j] = dp[i-1][j-1] + 1,否則,dp[i][j]=0。因為假如x[i-1]字元和y[j-1]字元不相等的話,以x[i-1]字元為結尾和以y[j-1]字元為結尾的公共子串就不存在,長度為0;假如相等,最短長度也為1,若之前還存在長為l的公共子串,那麼長度就為l+1。

所以狀態轉移公式為:

if x[i-1] == y[j-1]:

dp[i][j] = dp[i-1][j-1] + 1

if x[i-1]!=y[j-1]:

dp[i][j] = 0

def

findlongestsubstring

(s1, s2)

: m =

len(s1)

n =len(s2)

dp =[[

0for i in

range

(n +1)

]for i in

range

(m +1)

] mmax =

0 start =-1

for i in

range(1

, m+1)

:for j in

range(1

, n+1)

:if s1[i-1]

== s2[j-1]

: dp[i]

[j]= dp[i-1]

[j-1]+

1if dp[i]

[j]> mmax:

mmax = dp[i]

[j] start = i - mmax

return s1[start:start+mmax]

最長公共子串問題

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

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...