用二維陣列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
public static int lcs(string str1, string str2) else if (str1.charat(i-1) == str2.charat(j-1)) else }}
return c[len1][len2];
}
前面提到了子串是一種特殊的子串行,因此同樣可以用dp來解決。定義陣列的儲存含義對於後面推導轉移方程顯得尤為重要,糟糕的陣列定義會導致異常繁雜的轉移方程。考慮到子串的連續性,將二維陣列c[
i,j]
c[i,j]
用來記錄具有這樣特點的子串——結尾為母串x1
x2⋯x
i x1x2⋯xi與y
1y 2⋯y
j y1y2⋯yj
的結尾——的長度。
得到轉移方程:c[
i,j]
=⎧ ⎩ ⎨
⎪ ⎪ 0c
[i−1
,j−1
]+10
i=0o
rj=0
xi=y
jxi≠y j
c[i,j]=,j
∈ max(c[i,j]), i∈,j∈
注意點:如果輸入的字串是包含空格的,需要使用gets()輸入。
#include#include#include#include#includeusing namespace std;
char a[55],b[55];
int main()else if(a[i-1]==b[j-1])else
} }printf("%d\n",result);
return 0;
}
最長公共連續子串
這是兩個字串,所以狀態轉移矩陣肯定是二維矩陣。另外dp i j 代表的意思不是分別乙個字串的前 i 個和另乙個字串的前 j 個字元裡面的最長連續子串。而是以a i 和b j 為末端的公共連續子串長度。如果dp i j 代表是目前最長連續子串,那麼遞推公式就寫不出來,因為不知道dp i j 中公共子串...
最長公共連續子串LCS
csdn 定義dp i j 字串s1和s2的最長公共連續子串的最後乙個字元與這兩個字串的最後乙個字元相等的情況下,這個lcs的長度,狀態轉移方程為 注意觀察,a i b j 的情況下,dp i j 也等於0,這是子串行和子串在狀態轉移方程上的區別。那麼,我們通過兩層迴圈,計算出dp的值,然後找到其中...
最長公共子串行 最長連續公共子串行 最長遞增子串行
面試中除了排序問題,還會經常出現字串的子串行問題,這裡講解使用動態規劃解決三個常見的子串行問題 1 最長公共子串行問題 lcs,longest common subsequence problem 2 最長連續公共子串行問題 3 最長遞增子串行 lis,longest increment subse...