您的位置:首页 > 其它

算法: 动态规划解最长公共子串

2012-10-11 18:18 218 查看
继上篇文章“算法:动态规划解 0-1 背包问题”,再发一篇
上篇: http://blog.csdn.net/span76/article/details/8033953
#include <iostream>
using namespace std;

char a[]="abecd";
char b[]= "abcd";

char result[512];
int rIdx = -1;
int max2 = 0;

int find(char a[], char b[], int aIdx, int bIdx) {
if ( aIdx < 0 || bIdx < 0) {
int tIdx = rIdx;
if( max2 < tIdx+1  ){
max2 = tIdx+1;
while (tIdx>=0)
cout << result[tIdx--];  // 打印最长的串, 当然如果后来发现更长的也会打印
cout<< endl;
}
return 0;
}

if (  a[aIdx] == b[bIdx] ) {
result[++rIdx] = a[aIdx];  // 为了打印
int ret = 1 + find(a,b, aIdx-1, bIdx-1);
result[--rIdx]; // 递归的魅力在于能复原现场, 如果匹配,没有找到的最长串, 现场还是会被恢复
return ret;
}
else { // 对比下面的两种情况
int m = find(a,b, aIdx-1, bIdx);
int n = find(a,b, aIdx, bIdx-1);
return m>n? m: n;  // 取最优,体现动态规划的特点
}
}

int main() {
cout << "!!!Max Common String!!!" << endl;

int aLen = strlen(a);
int bLen = strlen(b);
cout << "1:" << a << endl;
cout << "2:" << b << endl;

int maxLen = find(a,b,aLen-1, bLen-1 );
cout << endl << "max len is " << maxLen ;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐