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

2021-09-19 05:52:02 字數 1467 閱讀 6357

時間限制:3秒;空間限制:32768k

對於兩個字串,請設計乙個時間複雜度為o(m*n)的演算法(這裡的m和n為兩串的長度),求出兩串的最長公共子串的長度。這裡的最長公共子串的定義為兩個序列u1,u2,..un和v1,v2,...vn,其中ui + 1 == ui+1,vi + 1 == vi+1,同時ui == vi。

給定兩個字串ab,同時給定兩串的長度nm

測試樣例:

"1ab2345cd",9,"12345ef",7

返回:4

本題求的時最長公共子串,和求最長公共子串行的區別在於子串必須連續。可以構建大小為n*m矩陣z,矩陣上對應位置z[i][j]代表a[i]b[j]是否相同,只有在一條連續斜線上的數均相同,代表該位置為ab兩串的公共字串。於是,對於z[i][j],若a[i]與b[j]不相等賦值為0;若相等則取z[i-1][j-1]的值加1,用以代表當前公共字串長度。最終輸出整個矩陣z的最大值,即為最長公共子串長度。

測試樣例對應的矩陣z為:

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

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

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

[0, 0, 0, 0, 0, 3, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 4, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0]]

示例程式:

# -*- coding:utf-8 -*-

class longestsubstring:

def findlongest(self, a, n, b, m):

# write code here

z = [[0 for i in range(m)] for j in range(n)]

max_val = 0 #記錄最大值

for i in range(n):

for j in range(m):

if a[i]==b[j]:

if i==0 or j==0:

z[i][j] = 1

else:

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

if z[i][j]>max_val:

max_val = z[i][j]

return max_val

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

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

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

演算法專題導航頁面 題目描述 給定兩個字串str1和str2,輸出兩個字串的最長公共子串,如果最長公共子串為空,輸出 1。輸入描述 輸入包括兩行,第一行代表字串srr1,第二行代表字串str2。1 length str1 length str2 5000 輸出描述 輸出包括一行,代表最長公共子串。示...

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

問題描述 說明 求解兩個字串的最長公共子字串,必須連續 動態規劃求解步驟 step 1 分析最優解的性質,刻畫其結構特徵 step 2 遞迴地定義最優解 僅當x i y j 時,d i,j d i 1,j 1 1 即當且僅當字串x i y j 時x i y j 的最長公共子字串長度d i,j 在x ...