動態規劃 最長公共字串

2021-09-24 11:28:04 字數 2622 閱讀 9136

思想:首先通過構造二維陣列,較長字串a作為行,較短字串b作為列。

將第一行和第一列初始化全初始化為1,

通過遞推式,如果當前兩個字串相等,則為左上角的數字加1,否則為0。

找出最大的數字,最大的數字表示公共字串的長度。

找出公共字串在字串a的角標,從後往前數公共字串個長度即為公共字串。

word_a="yawilsonafasfs32fda"

word_b="iwilsonolnm"

def sim_word(word_a,word_b):

cell=[[0]*len(word_b) for i in range(len(word_a))]

for i in range(len(word_a)):

for j in range(len(word_b)):

if word_a[i]==word_b[j] and (i<1 or j<1):

cell[i][j]=1

elif word_a[i]==word_b[j]:

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

return cell

sw=sim_word(word_a,word_b)

print(sw)

print(max(sw))

print([i for i in (map(max,sw))])

number=max(map(max,sw))

print(number)

index=-1

for line in sw:

if number in line:

index=sw.index(line)

print('index:',index)

break

print(sw[index])

print(word_a[index-number+1:index+1])

結果為:

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 6, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

[1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0]

6index: 7

[0, 0, 0, 0, 0, 0, 6, 0, 0, 1, 0]

wilson

list=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 6, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

for i in map(max,list):

print(i)

001

2345

6000

1010

0000

最長公共字串(動態規劃)

題目 給定兩個字串 str1 和 str2,返回兩個字串的最長公共子串。舉例 str1 1ad12345cd str2 12345ef 返回 12345 要求 如果str1 長度為m,str2長度為n,實現時間複雜度為o m n 額外空間複雜度 為o 1 的方法。實現 include include...

最長公共子字串 動態規劃

x y x和y的longest common substring為 長度為2 動態規劃解法 c i j 表示x 0.xi和y 0.yj的最大substringx i yj 的長度,比如 x y c 1 1 1 c 2 2 2 c 3 3 0 c 4 4 1 動態轉移方程為 如果xi yj,則 c i...

最長公共子串 最長公共子串 動態規劃

有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在1000以內 例如 輸入 abcde bcd 輸出 3 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。3 通過查詢出值為1的最長對角線就能找到最長公...