Given two strings, find the longest common subsequence (LCS).     最长公共子序列

Your code should return the length of LCS.

Clarification

Example

For "ABCD" and "EDCA", the LCS is "A" (or "D", "C"), return 1.

For "ABCD" and "EACB", the LCS is "AC", return 2.

应用: 在生物工程中,比较两个DNA串的相似性。

标签

解题:

1. 首先,必须弄清楚什么是子序列,什么是最长公共子序列;

2. 容易想的方法就是暴力求解,穷举所有子序列,然后找到最大的,然而这种指数级别的复杂度肯定不合适。

3. 所以我们需要分析问题,刻画公共子序列所具有的特征;

假设: 有两个字符串 A = “ABCDUHNEK” ;  B = ”KFACEKLO“  ;求解他两的最大公共子序列;

首先:两个字符串的长度设为: m=A.length(), n=B.length();

我们考虑两个字符串的最后一个字符A[m-1] 和 B[n-1] 。

(1)假如相等:两个字符串的最长公共子序列就一定包含最后一个字符,而且它的长度应该等价于字符串 A‘ = “ABCDUHNE” 与 B’ = ”KFACEKL“ 的最大公共子序列的长度+1

(2)假如不相等:两个字符串的最长公共子序列就有两种情况:等价于,A = “ABCDUHNEK” 与  B‘ = ”KFACEKL“ 的最大公子序列长度 或者

A‘ = “ABCDUHNE” 与  B = ”KFACEKLO“ 的最大公共子序列长度。

有此特点可以得到这个问题的递归解公式:

其中c[i,j]定义为一个二维数组,用于存储两个字符串最长公共子序列的长度。下标i,j表示字符串A中的前i-1个字符和 字符串B中的前 j-1个字符所具有的最长公共子串(注意:数组计数从0开始)。

递归求解,可得类似下表:

X字符串:ABCBDAB

Y字符串:BDCABA

算法时间复杂度为:Θ(m + n)。

实现代码如下:

class Solution {
public:
/**
* @param A, B: Two strings.
* @return: The length of longest common subsequence of A and B.
*/
int longestCommonSubsequence(string A, string B) {
// write your code here //最大公共子序列,方法在算法导论中有专门讲解。当学完之后来看,题目很简单。
//编程习惯要好! 注意括号对称,循环嵌套缩进!!!
int a=A.size();//两个字符串的长度
int b=B.size();
int num; //最大公共子序列长度
int c[a+][b+];//定义二维数组,用来存放最大公共子序列的长度,注意定义和引用时下标的区别;
for(int i=;i<a+;i++){
c[i][]=;
}
for(int j=;j<b+;j++){
c[][j]=;
} for(int i=;i<a;i++){
for(int j=;j<b;j++){
if(A[i]==B[j]){
c[i+][j+]=c[i][j]+;
}
else{
if(c[i][j+]>=c[i+][j]){
c[i+][j+]=c[i][j+];
}
else{
c[i+][j+]=c[i+][j];
}
}
}
}
num=c[a][b];
return num;
}
};

附:当需要返回最长公共子序列时,只需要在上面所考虑的三中情况下都设置相应的标记位就能实现了。表格中所画的三种箭头,在实际实现时可以用0,1,-1三个标志位来表示。

Lintcode--005(最长公共子序列)的更多相关文章

  1. LintCode 77: 最长公共子序列

    public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...

  2. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  3. lintcode:最长公共子序列

    题目 最长公共子序列 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度. 样例 给出"ABCD" 和 "EDCA",这个LCS是 "A& ...

  4. lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)

    Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...

  5. 用python实现最长公共子序列算法(找到所有最长公共子串)

    软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...

  6. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  7. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  8. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  9. 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题

    先要搞明白:最长公共子串和最长公共子序列的区别.    最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...

  10. LCS(Longest Common Subsequence 最长公共子序列)

    最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

随机推荐

  1. FMX手机app,如何下载网站图片而不卡界面

    你用的版本? 你应该关注下delphi 更新说明第一方法: 可以用线程.第二方法: TNetHTTPClient 已经支持异步 TThread.CreateAnonymousThread( proce ...

  2. Bug解决过程复盘

    反思了下,解决问题无外乎3w1h when where who how 就是查询出来的事情多了,现在不知道哪个地方出问题,应该根据日志一步一步梳理,查看每一步的输出结果是否与预期一致 顺藤摸瓜 觉得不 ...

  3. Linux企业级项目实践之网络爬虫(26)——线程池

    一旦有一个抓取请求开始,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出.这就是"即时创建,即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但 ...

  4. HDU_2049——部分错位排列,概率论

    Problem Description 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样 ...

  5. linux ubuntu 浏览器 字 字体 虚 解决办法

    在刚装好的ubuntu上什么都好,只是浏览器字体很虚,就连百度都虚 解决办法很简单 安装雅黑字体 修改font conf sudo vi /etc/fonts/conf.avail/69-langua ...

  6. JavaScript学习笔记(高级部分—01)

    JavaScript的核心ECMAScript描述了该语言的语法和基本对象:DOM描述了处理网页内容的方法和接口:BOM描述了与浏览器进行交互的方法和接口. 简单说,ECMAScript描述了以下内容 ...

  7. Android 开发 对话框Dialog dismiss和hide方法的区别

    http://ningtukun.blog.163.com/blog/static/186541445201310151539697/ dismiss和hide方法都可以隐藏对话框,在需要的时候也可以 ...

  8. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  9. Codeforces 486C Palindrome Transformation(贪心)

    题目链接:Codeforces 486C Palindrome Transformation 题目大意:给定一个字符串,长度N.指针位置P,问说最少花多少步将字符串变成回文串. 解题思路:事实上仅仅要 ...

  10. 好的android编码习惯

    上一期分享了android内存优化的一些总结,这一期说说我认为的好的编码习惯,然后下一期会做安卓数据库优化的一些总结,逐渐的会将一些性能优化点总结分享出来,肯定是不够全面的希望不足的地方欢迎指出. 良 ...