思想:首先通過構造二維陣列,較長字串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的最長對角線就能找到最長公...