動態規劃---求最長公共子序列
阿新 • • 發佈:2019-01-07
直接看題:
對於兩個字串,請設計一個高效演算法,求他們的最長公共子序列的長度,這裡的最長公共子序列定義為有兩個序列U1,U2,U3…Un和V1,V2,V3…Vn,其中Ui<Ui+1,Vi<Vi+1。且A[Ui] == B[Vi]。
給定兩個字串A和B,同時給定兩個串的長度n和m,請返回最長公共子序列的長度。保證兩串長度均小於等於300。
題意就是說,給出兩個字串,然後找出這兩個字串中公共序列的長度,比如說如下兩個字串,
“1A2C3D4B56”,10,”B1D23CA45B6A”,12
返回的就是6
直接上程式碼
int findLCS(string A, int n, string B, int m) {
// write code here
vector<int> v(m+1,0);
vector<vector<int>> res(n+1,v);//使用一個二維陣列來存放結果
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
if(A[i-1] == B[j-1])//開闢的vector是要比原本的字串長度要大的
res[i][j] = res[i-1][j-1]+1;
else
res[i][j] = max(res[i-1][j],res[i][j-1]);
}
}
return res[n][m];
}
動態規劃的主要思想就是將問題準成一個個交叉的子問題。直接去求這個兩個字串的最長序列不好求,那麼我們可以先求出前邊部分的最長序列,再根據前邊的一步步求下去,直到將兩個目標串都包含進去。