这是动态规划法 的典型题目,长度为row和长度为col的两个串,如何求他们的最长公共子序列。这个子序列是可以不连续的。
方法:
1 建立(row+1)*(col+1)的二维表,
2. 初始化其首行首列为零
3. 以m串为行,n串为列,那么可以逐行填写。第一行代表n串的第一个字符和m串比较, 第二行代表n串的第一和第二个字符都和m串比较,以此类推。
4. 如果是相同字符,那么就把[m-1][n-1]+1和[m-1[n]和[m][n-1]比较,填入大数。
5. 如此反复填完表,就可以得到最终结果[m][n]
很难一下子说清楚,这里就弥补一下一般书上都没有的C++程序吧:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Solution {
public:
int longestSub(string sa, string sb)
{
int row = sa.size();
int col = sb.size();
vector<vector<int> > dArray;
vector<int> rowV(col+1,0);
for(int i = 0; i<row+1; i++)
{
dArray.push_back(rowV);
}
for(int r=1; r<row+1; r++)
{
for(int c=1; c<col+1; c++)
{
dArray[r][c] = max(dArray[r-1][c], dArray[r][c-1]);
if(sa[r-1]==sb[c-1])
{
dArray[r][c] = max(dArray[r-1][c-1]+1, dArray[r][c]);
}
else
{
dArray[r][c] = max(dArray[r-1][c-1], dArray[r][c]);
}
}//for(int c=1; c<col+1; c++)
}//for(int r=1; r<row+1; r++)
return dArray[row][col];
}//int longestSub(string sa, string sb)
};
int main()
{
string str1("jisnldjife");
string str2("isdklnige");
Solution solu;
cout<<solu.longestSub(str1, str2);
cout<<endl;
return 0;
}