算法实践--最长公共子序列(Longest Common Subsquence)
什么是最长公共子序列
X=ACCG
Y=CCAGCA
长度为1的公共子序列: {A} {C} {G}
长度为2的公共子序列:{AC} {CC} {CG} {AG}
长度为3的公共子序列:{ACG}
长度为4的公共子序列
最长公共子序列即为 {ACG}
问题:长度为N和M的两个序列如何求他们的最长公共子序列?
X = ACCGGGTTACCGTTTAAAACCCGGGTAACCT
Y = CCAGGACCAGGGACCGTTTACCAGCCTTAAACCA
简单算法
for (int i=N; i>0; --i) {
找到X所有长度为i的子序列;
找到Y所有长度为i的子序列;
如果存在公共子序列则终止
}
复杂度O(2^N)
动态规划算法
定义C[i][j]为序列X[i..i]和Y[1..j]的最长子序列的长度
C[i][0]和C[0][j]==0
递推公式
C[i][j]=C[i-1][j-1]+1, X[i]==Y[j]
C[i][j]=MAX(C[i-1][j], C[i][j-1]), X[i]!=Y[j]
C++实现
template<typename T>
void prtM(vector< vector<T> >& arr, string msg = "") {
cout << msg << " " << endl;
for (auto i: arr) {
for (auto j: i) {
cout << j << " ";
}
cout << endl;
}
cout << endl;
} template <typename T>
void prt(vector<T>& arr, string msg = "") {
cout << msg << " ";
for (auto i: arr) {
cout << i << " ";
}
cout << endl;
} void prt_LCS(vector< vector<char> >& S, string& X, int i, int j) { // 递归调用
//cout << "i=" << i << " j=" << j << " " << S[i][j] << endl;
if (i== || j == )
return;
if ('s' == S[i][j]) {
prt_LCS(S, X, i-, j-);
cout << X[i];
} else if ('j' == S[i][j]) {
prt_LCS(S, X, i, j-);
} else {
prt_LCS(S, X, i-, j);
}
} void calc_LCS(string& X, string& Y) {
cout << "X: " << X << endl;
cout << "Y: " << Y << endl; vector< vector<int> > C; // 序列X[0..i] and Y[0..j]的公共子序列的长度
vector< vector<char> > S; //最长公共子串的位置
for (int i=; i<X.size(); i++) {
C.push_back( vector<int>(Y.size()) );
S.push_back( vector<char>(Y.size()) );
} for (int i=; i<X.size(); i++)
C[i][] = ;
for (int j=; j<Y.size(); j++)
C[][j] = ; for (int i=; i<X.size(); i++)
for (int j=; j<Y.size(); j++) {
if (X[i] == Y[j]) {
C[i][j] = C[i-][j-] + ;
S[i][j] = 's'; // 相同,可以打印
} else if ( C[i][j-] > C[i-][j] ) {
C[i][j] = C[i][j-];
S[i][j] = 'j'; //Y的最后一个可以去掉,不影响LCS
} else {
C[i][j] = C[i-][j] ;
S[i][j] = 'i'; //X的最后一个可以去掉,不影响LCS
}
} prtM(C);
prtM(S);
prt_LCS(S, X, X.size()-, Y.size()-);
cout<< endl;
} int main() { string S1 = " ACCGGGTTAC"; // 为了方便表示,忽略第一个字符
string S2 = " AGGACCA"; calc_LCS(S1, S2); return ;
}
算法实践--最长公共子序列(Longest Common Subsquence)的更多相关文章
- 算法实践--最长递增子序列(Longest Increasing Subsquence)
什么是最长递增子序列(Longest Increasing Subsquence) 对于一个序列{3, 2, 6, 4, 5, 1},它包含很多递增子序列{3, 6}, {2,6}, {2, 4, 5 ...
- 最长公共子序列(Longest common subsequence)
问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子序列.(子序列中的字符不要求连续) 这道题可以 ...
- 算法练习——最长公共子序列的问题(LCS)
问题描述: 对于两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列.X Y 各自字符串有顺序,但是不一定需要相邻. 最长公共子串(Longest Common Subst ...
- 最长公共子串(Longest common substring)
问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子串.(子串中的字符要求连续) 这道题和最长公共 ...
- Java实现 蓝桥杯VIP 算法提高 最长公共子序列
算法提高 最长公共子序列 时间限制:1.0s 内存限制:256.0MB 问题描述 给定两个字符串,寻找这两个字串之间的最长公共子序列. 输入格式 输入两行,分别包含一个字符串,仅含有小写字母. 输出格 ...
- 【算法】最长公共子序列(nlogn)
转载注明出处:http://blog.csdn.net/wdq347/article/details/9001005 (修正了一些错误,并自己重写了代码) 最长公共子序列(LCS)最常见的算法是时间复 ...
- ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))
这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...
- 利用后缀数组(suffix array)求最长公共子串(longest common substring)
摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...
- [Swift]LeetCode14. 最长公共前缀 | Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings. If there is n ...
随机推荐
- Matlab:高阶常微分三种边界条件的特殊解法(中心差分法,高精度导数边界处理)
函数文件1: function b=F(f,x0,h,N) % b(1,1)=x0(1)-h*x0(2)-u(1); % b(2,1)=x0(2)+h*x0(1)^2-u(2)-h*f; b=zero ...
- MongoDB 教程(六):创建集合、删除集合
MongoDB 创建集合 MongoDB 中使用 createCollection() 方法来创建集合. 语法格式: db.createCollection(name, options) 参数说明: ...
- .net反编译的九款神器
本人搜集了下8款非常不错的.Net反编译利器: 1.Reflector Reflector是最为流行的.Net反编译工具.Reflector是由微软员工Lutz Roeder编写的免费程序.Refle ...
- for in& for each in &for of
for...in语句以任意顺序遍历一个对象的可枚举属性.对于每个不同的属性,语句都会被执行. 语法 for (variable in object) {...} variable 在每次迭代时,将不同 ...
- VMware网络连接模式——桥接模式、NAT模式以及仅主机模式的介绍和区别
在使用VMware Workstation(以下简称:VMware)创建虚拟机的过程中,配置虚拟机的网络连接是非常重要的一环,当我们为虚拟机配置网络连接时,我们可以看到如下图所示的几种网络连接模式:桥 ...
- IO调度算法的理解(转载)
IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...
- django之model多表操作
一对多表之间的查询: class userInfo(models.Model): name = models.CharField(max_length=50) password = models.Ch ...
- acrgis 解决矢量转栅格分辨率过大造成连续值变离散且出现空白
目标:解决北京河流矢量polygon 转栅格的问题 设置栅格大小和影像一致30*30----结果发现,因为cell过大,原本连续的是矢量面变得不连续了,特别细的河流会出现间断(如下图所示): 1号 网 ...
- 01_Mybaits逆向工程maven版
1.创建generatorSqlmapCustom工程 2.修改pom文件 <?xml version="1.0" encoding="UTF-8"?&g ...
- python rtree包查找三维空间下的最近设备
rtree模块有2个常用的类:rtree.index.Index和rtree.index.Property.其中rtree.index.Index用于进行数据操作,rtree.index.Proper ...