最长公共子序列问题是经典的动态规划问题:给定两个字符串str1和str2,返回两个字符串的最长公共子序列(不一定要连续)。
举例: str1="a1b2c3d4" str2="a2b3c4e" 它们的最长公共子串是"abc"
下面是c++代码实现
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
string str1,str2;
cin>>str1>>str2;
int i,j;
int **dp;
*dp = new int[str1.size()];
for(int i=0;i<str1.size();i++){
dp[i] = new int[str2.size()];
}
dp[0][0] = str1[0] ==str2[0] ?1:0;
for(i =1;i<str1.size();i++){
dp[i][0] = max(dp[i-1][0],str1[i]==str2[0]?1:0);
}
for(i=1;i<str2.size();i++){
dp[0][i] = max(dp[0][i-1],str1[0]==str2[i]?1:0);
}
for(i =1;i<str1.size();i++){
for(j =1;j<str2.size();j++){
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
if(str1[i]==str2[j]) dp[i][j] = max(dp[i][j],dp[i-1][j-1]+1);
}
}
int maxlen = dp[str1.size()-1][str2.size()-1];
char *result = new char[maxlen];
int k = maxlen-1;
i = str1.size()-1;
j = str2.size()-1;
while(k>=0){
if(i>0 && dp[i][j] ==dp[i-1][j]){
i--;
}else if(j>0 && dp[i][j] ==dp[i][j-1]){
j--;
}else{
result[k--] = str1[i];
i--;
j--;
}
}
cout<<result<<endl;
return 0;
}