最長公共子串與最長公共子串行問題(動態規劃)

2021-09-19 17:13:24 字數 1597 閱讀 7047

公共子串是連續的,而公共子串行不是連續的。

x1 = "abcc",x2="acbcc",x1和x2的公共子串為"bcc",公共子串行為"abcc"。

我們來看一下兩個問題的轉移方程:

最長公共子串:

dp[i][j]=0               if i=0 or j=0

dp[i][j]=dp[i-1][j-1]+1 if x1[i]=x2[j]

dp[i][j]=0 if x1[i]!=x2[j]

最長公共子串行:

dp[i][j]=0                            if i=0 or j=0

dp[i][j]=dp[i-1][j-1]+1 if x1[i]=x2[j]

dp[i][j]=max(dp[i-1][j], dp[j][j-1]) if x1[i]!=x2[j]

最後,對於公共子串問題要求出dp中的最大值,而公共子串行問題轉移矩陣dp[-1][-1]即為所求。

**:

最長公共子串:

def longest_string(x1, x2):

x1 = "!" + x1

x2 = "?" + x2

dp = [[0 for _ in range(len(x1))]for _ in range(len(x2))]

max_len = 0

for j in range(1, len(x1)):

for i in range(1, len(x2)):

if x1[j] == x2[i]:

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

max_len = max(max_len, dp[i][j])

return print(max_len)

x1 = input()

x2= input()

longest_string(x1, x2)

最長公共子串行:

def longest_string(x1, x2):

x1 = "!" + x1

x2 = "?" + x2

dp = [[0 for _ in range(len(x1))]for _ in range(len(x2))]

max_len = 0

for j in range(1, len(x1)):

for i in range(1, len(x2)):

if x1[j] == x2[i]:

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

else:

dp[i][j] = max(dp[i-1][j], dp[i][j-1])

return dp[-1][-1]

x1 = input()

x2 = input()

longest_string(x1, x2)

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

最長公共子串行 常用於解決字串的相似度,是指在母串中都出現過並且出現順序與母串保持一致的子串,不要求連續性。最長公共子串 是指在母串中連續出現的子串。例如 cnblogs belong 最長公共子串行為blog,最長公共子串為lo假設z z2,zk 是母串 x 與 y的最長公共子串行lcs,那麼 用...

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

一 最長公共子串 longest common substring 遍歷的時候用乙個二維陣列儲存相應位置的資訊,如果兩個子串1與子串2相應位置相等 則看各自前乙個位置是否相等,相等則該位置值b i j b i 1 j 1 1,不相等則置為1。如果兩個子串1與子串2相應位置不相等,則b i j 0。如...

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

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...