邓俊辉版数据结构,动态规划求解最长公共子序列学习总结。
第一种方法是通过递归实现。思路如下,两字符串长度长度分别为 a,b,比较他们的末位字符,这里是有三种情况
- 若有一方长度为零,则返回“”,这是递归方程的递归基。
- 若两字符串的末位字符相同,去掉末尾字符,返回规模递减的问题f(a-1,b-1)。这里是“减而治之”策略。
- 若两字符串末位字符不同,则有两种情况通过比较(a-1,b) 和(a,b-1)长度的字符串的最长公共子序列的长度,像长度较大的方向继续进行递归,返回f(a-1,b)或f(a,b-1),这里用的是“分而治之”策略。
实现代码如下
#include <iostream>
using namespace std;
string substring = "";
string lcs(string s1,string s2);
int main(){
string s1, s2;
cout << "please enter the first string\n";
cin >> s1;
cout << "please enter the second string\n";
cin >> s2;
cout<<"the longest conmmon subsequence is "<<lcs(s1, s2);
}
string lcs(string s1,string s2){
int a,b;
a = s1.length()-1;
b = s2.length()-1;
if(a==-1||b==-1){
//substring += "";
//reverse(substring.begin(),substring.end());
return "";
}
else if(s1[a]==s2[b]){
//substring += s1[a];
char m = s1[a];
s1 = s1.substr(0, a);
s2 = s2.substr(0, b);
return lcs(s1,s2)+m;
}
else{
string s11 = s1.substr(0, a);
string s22 = s2.substr(0, b);
int l1 = lcs(s11, s2).length();
int l2 = lcs(s1, s22).length();
if(l1>l2){
s1 = s11;
return lcs(s1,s2);
}
else{
s2 = s22;
r