最长公共子串
2016-05-10 01:46
337 查看
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。
例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。
例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。
void LCS(char *p, char *q) { if (p == NULL || q == NULL) { return 0; } int len1 = strlen(p); int len2 = strlen(q); if (len1 < 1 || len2 < 1) { return 0; } int buf[len1+1][len2+1]; memset(buf, 0, sizeof(buf)); for (int i = 1; i < len1+1; i++) { for (int j = 1; j < len2+1; j++) { if (p[i-1] == q[j-1]) { buf[i][j] = buf[i-1][j-1] + 1; } else if (buf[i-1][j] > buf[i][j-1]) { buf[i][j] = buf[i-1][j]; } else { buf[i][j] = buf[i][j-1]; } } } int i = len1; int j = len2; stack<char> temp; while (i > 0 && j > 0) { if (p[i-1] == q[j-1]) { temp.push(p[i-1]); i--; j--; } else if (buf[i-1][j] > buf[i][j-1]) { i--; } else { j--; } } while (!temp.empty()) { cout << temp.top() << " "; temp.pop(); } cout << endl; return buf[len1][len2]; }
相关文章推荐
- Hadoop 裡的 fsck 指令
- JSP指令
- 17 messages for one URL request
- solve stiffness matrix in matlab
- NightWatchJS
- C++ setprecision fixed showpoint
- 产品思维学习(二)--获取用户需求
- maven搭建nexus私服在myeclipse中的使用
- 1000
- gedit 打开中文乱码。。
- 通知 Notification 详解
- console.log是异步的吗?
- c++第五次实验(数组分离)
- ACM1.1题解
- 编程需要知道多少数学知识?
- golang学习第二篇 开发环境的搭建
- 大数据Java基础第六天作业
- 红外遥控解码
- [leetcode] 306. Additive Number 解题报告
- Python再接触