20170828_最长公共子序列 LCS
//最长公共子序列LCS
/*
请编写一个函数,输入两个字符串,求它们最长公共子序列。例如:
ABCBDAB和BDCABA,字符序列BCBA和BDAB都是它们的最长公共子序列,则输出4
*/
/*很明显,这是动态规划问题:DP问题
1、假设序列分别是:X=< X0,X1,X2, ... ,Xm-1,Xm > Y=< Y0,Y1,Y2, ... ,Yn-1,Yn >
它的一个最长公共子序列是:Z=< Z0,Z1,Z2, ... ,Zk >
2、当Xm=Yn时,LCS(Xm,Yn)= LCS(Xm-1,Yn-1)+1
当Xm!=Yn时,LCS(Xm,Yn)= max(LCS(Xm-1,Yn),LCS(Xm,Yn-1))
3、显然,当X或Y为空时,LCS长度是为零。
*/
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
class Solution
{
public:
void GetLCS(const string &strA, const string &strB)
{
int n=strA.size();
int m=strB.size();
if(n==0 || n==0)
{
cout<<0<<endl;
return;
}
//建立一个 n+1 行 m+1 列 的表格,并初始化表格
//dp[i][j]表示:strA[0-i]与strB[0-j]之间的LCS
vector<vector<int>> dp(n+1,vector<int>(m+1,0));
//按照状态转移方程,填充表格
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
if(strA[i-1]==strB[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[n][m]<<endl;
}
};
int main(void)
{
string strA,strB;
class Solution object;
while(cin>>strA>>strB)
{
cout<<strA<<" "<<strB<<endl;
object.GetLCS(strA,strB);
}
system("pause");
return 0;
}