【经典面试题一】最长公共子序列(经典动态规划题)
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动态规划法
用动态规划法首先要判断该问题是否符合动态规划法的条件。时间复杂度O(n^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; }
转载于:https://www.cnblogs.com/SHERO-Vae/p/5800290.html
【经典面试题一】最长公共子序列(经典动态规划题)相关推荐
- 【BZOJ2423】最长公共子序列(动态规划)
[BZOJ2423]最长公共子序列(动态规划) 题面 BZOJ 洛谷 题解 今天考试的时候,神仙出题人\(fdf\)把这道题目作为一个二合一出了出来,我除了orz还是只会orz. 对于如何\(O(n^ ...
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)...
2019独角兽企业重金招聘Python工程师标准>>> 问题描述:序列X={x1,x2,-,xn},Y={y1,y2,-,yn},当Z={z1,z2-,zn}是X的严格递增下标顺序( ...
- [Leetcode][第1143题][JAVA][最长公共子序列][LCS][动态规划]
[问题描述][中等] [解答思路] 时间复杂度:O(N^2) 空间复杂度:O(N^2) class Solution {public int longestCommonSubsequence(Stri ...
- LeetCode 1143. 最长公共子序列(动态规划)
1. 题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度. 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符 ...
- 算法知识之最长公共子序列问题(动态规划)
最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...
- 【算法设计与分析】最长公共子序列问题 动态规划算法 超详细
最长公共子序列问题描述 注意:最长公共子序列不一定是连续序列. 例如:"ASAFAGAHAJAK"与"AAAAAAA"的最长公共子序列为:AAAAAA 公共子序 ...
- 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...
- leetcode1143. 最长公共子序列(动态规划)
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度. 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删 ...
- 蓝桥杯 ADV-202算法提高 最长公共子序列(动态规划)
问题描述 给定两个字符串,寻找这两个字串之间的最长公共子序列. 输入格式 输入两行,分别包含一个字符串,仅含有小写字母. 输出格式 最长公共子序列的长度. 样例输入 abcdgh aedfhb 样例输 ...
- 2017蓝桥杯B组:最长公共子序列(动态规划详解(配图))
最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和"baabcdadabc", 可以找到的最长的公共子串 ...
最新文章
- gpg的一些常用操作
- 网络推广外包专员浅析为什么说早在建站初期就要做好网络推广外包
- 下次激活策略10_巅峰武侠卡牌巨制手游乱世江湖1元商城特权bt版今日10:00上线_乱世江湖...
- VTK:PolyData之MultiBlockMergeFilter
- docker tomcat 多开 实例_Docker zabbix-agent 监控 docker tomcat 多实例
- mvc4 html.pager,MVC分页之MvcPager使用详解
- 多用途bootstrap后台管理系统模板企业统计管理界面模板
- java 蓝桥杯算法提高 身份证号码升级(题解)
- C语言输出百分号%的方法和示例
- spring aop实例讲解_Spring核心技术详解(一)
- 关于如何查看 EntityValidationErrors 详细信息的解决方法
- 用折半查找法查找某一字符在字符串中的位置
- Java查看class的JVM,指令集文件--javap -c ClassName
- Redis单线程模型详解
- Matlab取整函数
- 速率法和终点法的区别_两点法终点法速率法.doc
- 企业为什么着急签三方_学校又在催我签三方了、三方协议很重要吗、签完三方能毁约吗……...
- Ubuntu编译OpenPose的一些坑(附可能涉及的码云地址)
- Android:安卓实现高考倒计时功能
- B - 验证角谷猜想
热门文章
- .net后台获取html控件值的2种方法
- HBase总结(十二)Java API 与HBase交互实例
- jsp中类似gridview的功能
- 使用STL的next_permutation函数生成全排列(C++)
- gin使用BasicAuth()(验证)中间件
- shell实例第13讲:从FTP服务器下载文件
- 写出程序删除链表中的所有接点
- linux系统的交换分区怎么分配?
- apache服务器的配置文件httpd.conf中有很多内容,请解释如下配置项:
- FastDFS 安装步骤(ubuntu)