动态规划 - 最长公共子串
2015-12-10 22:34
309 查看
最长公共子串和最长公共子序列在状态转移方程有些类似的地方,不同的是长公共子串要求必须在原串中是连续的,所以一但某处出现不匹配的情况,此处的值就重置为0。
下面给出最长公共子串的状态转移方程:
dp[0][j] = 0; (0<=j<=m)
dp[i][0] = 0; (0<=i<=n)
dp[i][j] = dp[i-1][j-1] +1; (str1[i] == str2[j])
dp[i][j] = 0; (str1[i] != str2[j])
不多说上代码---实现了打印最长公共子串的功能,很简单!
下面给出最长公共子串的状态转移方程:
dp[0][j] = 0; (0<=j<=m)
dp[i][0] = 0; (0<=i<=n)
dp[i][j] = dp[i-1][j-1] +1; (str1[i] == str2[j])
dp[i][j] = 0; (str1[i] != str2[j])
不多说上代码---实现了打印最长公共子串的功能,很简单!
#include "stdafx.h" #include <stdio.h> #include <string> #include <iostream> using namespace std; #define MAXSIZE 100 char str1[MAXSIZE]; char str2[MAXSIZE]; int dp[MAXSIZE][MAXSIZE]; //'y'代表str1[i] = str2[j];'n'反之 char path[MAXSIZE][MAXSIZE]; void printComStr(int i, int j) { if (path[i][j] == 'n' || i == 0 || j == 0) return; if (path[i][j] == 'y') { printComStr(i - 1, j - 1); cout << str1[i - 1]; } } int main() { int n, m; int indexi, indexj; int ans = 0; cin >> str1 >> str2; n = strlen(str1); m = strlen(str2); for (int i = 0; i <= n;i++) for (int j = 0; j <= m; j++) { dp[i][j] = 0; } for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { if (str1[i - 1] == str2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; path[i][j] = 'y'; } else { dp[i][j] = 0; path[i][j] = 'n'; } } for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { if (ans < dp[i][j]) { ans = dp[i][j]; indexi = i; indexj = j; } } cout << ans << endl; cout << indexi << ' ' << indexj << endl; printComStr(indexi, indexj); }
相关文章推荐
- nagios使用的问题解决
- Openfiler安装过程:
- 规划和按安装邮件系统
- Python 基础语法(一)
- 10G(82599EB) 网卡测试优化(总)
- PAT 1045 快速排序
- HDU 2119 Matrix 二分图最小点覆盖
- CSS的继承、层叠和特殊性
- 一个二分法的面试题目
- Django doc summary (5)
- 一个自己用lucene写的敏感词查询
- FireFox 之 event is not defined
- 最好的Python机器学习库
- Django doc summary (4)
- easyui
- 就决定是你了!
- Just another Robbery(背包)
- python学习之路之案例2---计算器
- 可变参数(C语言):stdarg.h
- Ubuntu15.04 安装卡在logo界面不动