算法: 动态规划解最长公共子串
2012-10-11 18:18
218 查看
继上篇文章“算法:动态规划解 0-1 背包问题”,再发一篇
上篇: http://blog.csdn.net/span76/article/details/8033953
上篇: 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; }
相关文章推荐
- 算法题39 最长公共子串--动态规划
- 算法作业6 动态规划 - 最长公共子串问题
- 算法题9 动态规划之最长公共子序列&amp;最长公共子串
- 算法回顾 - 动态规划 之 最长公共子串问题
- 利用后缀数组求字符串的最长重复子串的算法 利用二维数组求两个字符串的最长公共字串(动态规划)
- 0012算法笔记——【动态规划】最长公共子串问题
- [算法笔记]动态规划之最长公共子串和最长公共子序列
- 动态规划-最长公共子串问题-java版
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 算法实现-->最长公共子串
- 【字符串处理算法】获取最长公共子串的算法设计及C代码实现
- 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用
- 【动态规划】最长公共子序列与最长公共子串
- 【动态规划】最长公共子序列和最长公共子串
- LCS算法求最长公共子串
- [置顶] 【动态规划】求最长公共子串,最长回文子串
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- C++之最长公共子串(最长子数组和)(22)---《那些奇怪的算法》
- 最长公共子串算法的学习笔记