給出兩個字串,求這兩個字串的公共子串。(還有乙個類似的問題是兩字串的公共子串行,有待分析)。
例子:
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 當然我們現在一眼就可以看出來最長公...