問題描述: 給出兩個字串,找到最長公共子串行(lcs),返回lcs的長度。
最長公共子串行的定義:最長公共子串行問題是在一組序列中找到最長公共子串行(不同於公共子串,lcs不需要是連續的子串)
輸入: 給出字串」abcd」和字串「edca」
輸出: 1
"""
dp[i - 1][j - 1] + 1 if s1[i] == s2[j]
dp[i][j] = max(dp[i -1][j], dp[i][j - 1]) others
"""def
lcs(s1, s2)
:def
show
(mat)
:for i in mat:
print
(i)if
not s1 or
not s1:
return
0 m, n =
len(s1)
,len
(s2)
# tmp is a obejct
tmp =[0
,]* n dp =
# deep copy
for i in
range
(m):))
# 1. 處理s1與s2[0]的情況
index =[0
,]for i in
range
(m):
if s1[i]
== s2[0]
: index[0]
= i break
for j in
range
(index[0]
, m)
: dp[j][0
]=1# 2. 處理s1[0]與s[1]的情況
for x in
range
(n):
if s1[0]
== s2[x]
: index[0]
= x break
for y in
range
(index[0]
, n)
: dp[0]
[y]=
1# dp state
# show(dp)
# 3. 處理其餘情況
for i in
range(1
, m)
:for j in
range(1
, n)
:if s1[i]
== s2[j]
: dp[i]
[j]= dp[i -1]
[j -1]
+1else
: dp[i]
[j]=
max(dp[i -1]
[j], dp[i]
[j -1]
) show(dp)
return dp[m -1]
[n -1]
if __name__ ==
'__main__'
:# sample1
s1 =
'blog.csdn.net'
s2 =
'csdn.blogt'
result = lcs(s1, s2)
print
(result)
# for sample1, the answer should be 6
# sample2
s1 =
"a1bc2"
s2 =
"abb4c"
result = lcs(s1, s2)
print
(result)
# for sample2, the answer should be 3
程式設計題 最長公共子串行
也就是lcs問題,常規的動態規劃題目,狀態轉移矩陣見下圖 class solution def lsc self,a,b len a,len b len a len b dp i j 表示a的前i個數和b的前j個數構成的最長公共子串長度 dp 0 len b 1 for in range len a...
最長公共子串行 最長公共子串
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 當然我們現在一眼就可以看出來最長公...