程式設計題 最長公共子串行

2021-09-25 20:23:18 字數 1977 閱讀 9180

問題描述: 給出兩個字串,找到最長公共子串行(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 當然我們現在一眼就可以看出來最長公...