最长公共子序列(Longest common subsequence)
问题描述:
给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子序列。(子序列中的字符不要求连续)
这道题可以用动态规划解决。定义c[i, j]表示Xi和Yj的LCS的长度,可得如下公式:

伪代码如下:

C++实现:
int longestCommonSubsequence(string x, string y)
{
int m = x.length();
int n = y.length();
vector< vector<int> > c(m + , vector<int>(n + )); for (int i = 0; i <= m; ++i)
c[i][] = ;
for (int j = 1; j <= n; ++j)
c[][j] = ;
for (int i = ; i <= m; ++i)
{
for (int j = ; j <= n; ++j)
{
if (x[i-] == y[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-];
}
}
return c[m][n];
}
后记:
我本来以为我已经掌握了LCS,其实不过是记住了LCS的状态转移方程。15号参加了创新工场2016校园招聘笔试,题目要求打印出LCS,我就懵逼了。其实《算法导论》里讲的清清楚楚啊。

贴一下我的C++实现:
vector< vector<int> > b; //辅助数组
void LCS(string x, string y)
{
int m = x.length();
int n = y.length(); vector< vector<int> > c(m + , vector<int>(n + ));
for (int i = ; i <= m; ++i)
c[i][] = ;
for (int j = ; j <= n; ++j)
c[][j] = ; b.resize(m+);
for (int i = ; i <= m; i++)
{
b[i].resize(n+);
}
for (int i = ; i <= m; i++)
for (int j = ; j <= n; j++)
{
b[i][j] = ;
} for (int i = ; i <= m; ++i)
{
for (int j = ; j <= n; ++j)
{
if (x[i-] == y[j-])
{
c[i][j] = c[i-][j-] + ;
b[i][j] = ; //
}
else if (c[i-][j] >= c[i][j-])
{
c[i][j] = c[i-][j];
b[i][j] = ; //
}
else
{
c[i][j] = c[i][j-];
b[i][j] = ; //
}
}
} } void printLCS(vector< vector<int> > &b, string x, int i, int j)
{
if (i == || j == )
return ;
if (b[i][j] == )
{
printLCS(b, x, i-, j-);
printf("%c", x[i-]);
}
else if (b[i][j] == )
printLCS(b, x, i-, j);
else
printLCS(b, x, i, j-); }
阿里、腾讯、创新工场全部笔试跪;网易互联网简历挂;明天去面百度和华为,加油!!!
最长公共子序列(Longest common subsequence)的更多相关文章
- 算法实践--最长公共子序列(Longest Common Subsquence)
什么是最长公共子序列 X=ACCG Y=CCAGCA 长度为1的公共子序列: {A} {C} {G} 长度为2的公共子序列:{AC} {CC} {CG} {AG} 长度为3的公共子序列:{ACG} 长 ...
- 最长公共子串(Longest common substring)
问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子串.(子串中的字符要求连续) 这道题和最长公共 ...
- UVA10100:Longest Match(最长公共子序列)&&HDU1458Common Subsequence ( LCS)
题目链接:http://blog.csdn.net/u014361775/article/details/42873875 题目解析: 给定两行字符串序列,输出它们之间最大公共子单词的个数 对于给的两 ...
- 利用后缀数组(suffix array)求最长公共子串(longest common substring)
摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...
- 300最长上升子序列 · Longest Increasing Subsequence
[抄题]: 往上走台阶 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的. 样例 给出 [5,4,1,2,3],LIS 是 [1,2 ...
- 动态规划--最长上升子序列(Longest increasing subsequence)
前面写了最长公共子序列的问题.然后再加上自身对动态规划的理解,真到简单的DP问题很快就解决了.其实只要理解了动态规划的本质,那么再有针对性的去做这方的题目,思路很快就会有了.不错不错~加油 题目描述: ...
- [Swift]LeetCode14. 最长公共前缀 | Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings. If there is n ...
- [Swift]LeetCode300. 最长上升子序列 | Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...
- [Swift]LeetCode594. 最长和谐子序列 | Longest Harmonious Subsequence
We define a harmonious array is an array where the difference between its maximum value and its mini ...
随机推荐
- Hadoop在Ubuntu的安装和使用
由于小编在本学期有一门课程需要学习hadoop,需要在ubuntu的linux系统下搭建Hadoop环境,在这个过程中遇到一些问题,写下这篇博客来记录这个过程,并把分享给大家. Hadoop的安装方式 ...
- CentOS Linux安装后扩充SWAP分区
1. 首先先查看目前swap分区大小: free -hm total used free shared buffers cached Mem: 11G 801M 10G 236K ...
- kafka的基本体系结构
使用场景 大数据:数据量和速率激增,数据类型越来越复杂 应用开发:消息引擎,应用解耦,分布式存储,流处理 Kafka的体系结构 topic : 主题(消息的逻辑分类) 客户端: 细分为生产者(朝主题发 ...
- Tomcat启动过程原理详解 -- 非常的报错:涉及了2个web.xml等文件的加载流程
Tomcat启动过程原理详解 发表于: Tomcat, Web Server, 旧文存档 | 作者: 谋万世全局者 标签: Tomcat,原理,启动过程,详解 基于Java的Web 应用程序是 ser ...
- 当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花
前言 今年主要会做一个比较完整的微服务项目开源出来.目前已经开始了,刚兴趣的先Star一个吧. 项目:https://github.com/yinjihuan/kitty-cloud 基础框架:htt ...
- 别人用钱,而我用python爬虫爬取了一年的4K高清壁纸
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...
- vue axios post请求下载文件,后台springmvc完整代码
注意请求时要设置responseType,不加会中文乱码,被这个坑困扰了大半天... axios post请求: download(index,row){ var ts = ...
- 使用NLP从文章中自动提取关键字
背景 在研究和新闻文章中,关键词构成了一个重要的组成部分,因为它们提供了文章内容的简洁表示.关键词在从信息检索系统,书目数据库和搜索引擎优化中定位文章方面也起着至关重要的作用.关键词还有助于将文章分类 ...
- javascript: Object对象生成URL参数
code: function makeQuery(queryObject) { const query = Object.entries(queryObject) .reduce((result, e ...
- 白话理解https
为什么需要加密? 因为http的内容是明文传输的,传输过程有可能被劫持或被篡改(中间人攻击),如何解决? 当然是加密.最简单的方式就是对称加密(快). 对称机密 就是一个密钥,可以理解为一把钥匙,我们 ...