這是兩個字串,所以狀態轉移矩陣肯定是二維矩陣。另外dp[ i ][ j ]代表的意思不是分別乙個字串的前 i 個和另乙個字串的前 j 個字元裡面的最長連續子串。而是以a[ i ]和b[ j ]為末端的公共連續子串長度。如果dp[ i ][ j ]代表是目前最長連續子串,那麼遞推公式就寫不出來,因為不知道dp[ i ][ j ]中公共子串的位置,所以就不知道新增字元之後對公共字串長度的影響。
所以dp[ i ][ j ]代表尾部的公共子串長度,然後取所有dp[ i ][ j ]中的最大值,就是兩個字串中最長公共連續子串的長度。
# 迴圈要從0到len(string)+1
# 原因就是從第0個字串開始時候,保持遞推公式的完整,不用在第0個字串時,前面沒有可依據的數值。所以就是初始化了dp[0][j]和dp[i][0]為0
for i in range(1,len2+1):
for j in range(1,len1+1): # 這個雙層迴圈的意義就是填滿二維矩陣,對於演算法原理本身沒有什麼關聯
if string2[i-1] == string1[j-1]:
# 遞推公式
res[i][j] = res[i-1][j-1]+1
# result是全域性的結果
result = max(result,res[i][j])
return result
print(lcstring("helloworld","loop"))
最長公共連續子串和最長連續公共子串行
用二維陣列c i j 記錄串x1 x2 x i x1x2 xi與y 1y 2 y j y1y2 yj 的lcs長度,則可得到狀態轉移方程c i,j 0c i 1 j 1 1max c i,j 1 c i 1,j i 0 orj 0i,j 0a ndxi y j i,j 0a ndxi y j pub...
最長公共連續子串LCS
csdn 定義dp i j 字串s1和s2的最長公共連續子串的最後乙個字元與這兩個字串的最後乙個字元相等的情況下,這個lcs的長度,狀態轉移方程為 注意觀察,a i b j 的情況下,dp i j 也等於0,這是子串行和子串在狀態轉移方程上的區別。那麼,我們通過兩層迴圈,計算出dp的值,然後找到其中...
最長公共子串與最長連續子串演算法
利用dp思想 最長公共子串中result i j 存放str1前i個與result j 個的最長公共子串,當str1 i 1 str2 j 1 時,str1前i 1與str2前j 1個即result i 1 j 1 result i j 1,否則就是str1前i個與str2前j 1個的公共子串與st...