经典面试题:最长公共子序列

简介:

1.问题描述:

什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。

    举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。

    注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。比如字符串acdfg同akdfc的最长公共子串为df,而他们的最长公共子序列是adf。LCS可以使用动态规划法解决。下文具体描述。

2.解决思路:

2.1穷举法

2.2动态规划法

用动态规划法首先要判断该问题是否符合动态规划法的条件,

 (1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

    (2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

   (3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)

3.源码:

// LCSTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<cstdlib>
#include<string>
#include<vector>
using namespace std;

void LCS(string str1,string str2)
{
	int len1 = str1.length();
	int len2 = str2.length();
	//int **dp = new int[len1+1][len2+1];
	vector<vector<int> > dp(len1+1,vector<int>(len2+1));
	
	//动态规划初始值	
	for(int j = 0;j <= len2;j++)
		dp[0][j] = 0;
	for(int i = 0;i <=len1;i++)
		dp[i][0] = 0;

	for(int i = 0;i < len1;i++)
		for(int j = 0;j < len2;j++)
		{
			if(str1.at(i) == str2.at(j))
			{
				dp[i+1][j+1]= dp[i][j]+1;				
			}
			else if(dp[i][j+1] > dp[i+1][j])
				dp[i+1][j+1] = dp[i][j+1];
			else 
				dp[i+1][j+1] = dp[i+1][j];
		}
		cout<<"最长公共子序列长度为:"<<dp[len1][len2]<<endl;

		int ti = 0;
		int tj = 0;
		while(ti<len1 && tj<len2 )
		{
			if(str1.at(ti) == str2.at(tj))
			{
				cout<<str1.at(ti)<<" ";
				ti++;
				tj++;
			}
			else if(dp[ti+1][tj] >= dp[ti][tj+1])
				ti++;
			else
				tj++;
		}
}
int _tmain(int argc, _TCHAR* argv[])
{
	string str1 = "asddgflsksdjflkdf";
	string str2 = "sdflsdzf";
	LCS(str1,str2);
	return 0;
}



相关文章
|
JavaScript
Element el-radio 单选框详解
本文目录 1. 用途 2. 单选框 3. 单选框样式 4. 单选框组 4. 单选框组样式 5. 尺寸调节 6. 绑定值变化事件 7. 小结
1865 0
Element el-radio 单选框详解
|
自然语言处理 程序员 编译器
Python编程基础:实验4——组合数据的综合实验
Python编程基础:实验4——组合数据的综合实验代码练习
534 0
Python编程基础:实验4——组合数据的综合实验
|
JavaScript 前端开发 算法
精讲 JavaScript 逻辑运算符:与、或、非
精讲 JavaScript 逻辑运算符:与、或、非
1531 0
精讲 JavaScript 逻辑运算符:与、或、非
|
数据可视化 算法 Python
FL Studio20.99最新试用版功能介绍V21正式版
水果的话,我用的版本是去年刚更新20.9,目前支持中文挺友好的,算很新的版本了。水果音乐制作软件FL Studio20中文版是一款非常好用且功能强大的软件音乐制作环境或数字音频工作站(DAW)。FL studio中文版下载地址:http://t.csdn.cn/0A4P6
564 0
|
小程序 前端开发 架构师
微信点餐系统的开发与实现
   随着互联网技术逐渐的深入到生活,人们的生活消费习惯,已经发生很大的变化。就餐厅用餐而言,互联网技术和移动互联网技术的应用也己相关普及,比如早几年前就出现的餐厅点餐系统,就通过信息化的技术手段代替原来纸质菜单点餐的传统方式。这种方式一是可以方便顾客实现点餐叫号,二是方便商家进行人单合一的统一管理,减少了报单出错率,提升了用户的体验,所以得以大面积的应用和普及。        而移动互联网的出现,让智能手机的赋能更大广泛,腾讯微信适时推出微信小程序,使得智能手机的用户可以通过微信进行相应的信息化管理和参与,比如目前大面积应用的小程序商城,就将商业的业态从传统的PC互联网直接植入手机移动互
430 0
微信点餐系统的开发与实现
|
Swift iOS开发
Swift:暗黑模式iOS 13以上支持是否跟随系统和iOS13以下的主题适配
Swift:暗黑模式iOS 13以上支持是否跟随系统和iOS13以下的主题适配
1802 0
Swift:暗黑模式iOS 13以上支持是否跟随系统和iOS13以下的主题适配
|
弹性计算 CDN
阿里云建站:企业网站定制/速成美站/响应式功能建站官方购买及优惠详解!
阿里云网站建设分为云企业官网定制、云速成美站和响应式功能定制建站,星速云来详细介绍下云·企业官网定制、云·速成美站和响应式功能定制建站的区别,以及各个版本的官方报价:
1420 0
|
大数据 分布式计算 MaxCompute
【最全合集】一文看尽 2019杭州云栖大会 MaxCompute 技术分享
本文汇集2019杭州云栖大会上MaxCompute的主题分享,内容涵盖MaxCompute技术关键进展及展望,超大规模企业级计算引擎,分布式智能调度执行框架,列式存储引擎,MaxCompute生态,大数据平台的安全风控以及混合云模式下 MaxCompute + Hadoop 混搭大数据架构实践等内容,从底层技术到最佳实践,内容广泛而深入,希望能让读者有所收获。
10914 0
【最全合集】一文看尽 2019杭州云栖大会 MaxCompute 技术分享
|
SQL 数据可视化 搜索推荐
Quick BI产品核心功能大图(三)电子表格: 新手亦可表格自由
随着企业业务快速增长,单纯的表或交叉表展现的数据模式相对固定,已不能满足企业中不同角色用户、不同业务场景数据可视化分析展现的诉求。在满足业务人员可视化需求层面,Quick BI不仅提供了丰富的图表组件,也提供了中国式报表制作功能-电子表格。
Quick BI产品核心功能大图(三)电子表格: 新手亦可表格自由
|
Web App开发 存储 移动开发
chrome地址栏命令和快捷键,强大到天际,你知道多少!
前端一些有意思的内容,旨在3-10分钟里, 500-1500字,有所获,又不为所累。 chrome菜单栏的命令,其底层都是调用了chrome://[xx] 这种内置地址, 外加快捷键 所以地址和快捷键记得好,根本没菜单什么事!
1798 0

热门文章

最新文章