对两个字符串求最大公共子序列,子序列意味着不是连续的序列。

子问题:LCS(s1,s2)表示最大公共子序列

首先基于一个判断,

1)s1和s2有相同的结尾x,那么x一定在最大公共子序列中,  LCS(s1,s2)=LCS(s1[:-1],s2[:-1])+1

2)s1和s2没有相同结尾,那么LCS(s1,s2)=max{ LCS(s1[:-1],s2),LCS(s1,s2[:-1]) }

可以写成下面的表达式,C[i,j]表示s1的前i个字符和s2的前j个字符的最大公共子序列,其中i=0或者j=0时,表示其中一个字符串为空,这时候LCS=0

伪代码:

int lcs(string str1, string str2, vector<vector<int>>& vec) {  
                        int len1 = str1.size();  
                        int len2 = str2.size();  
                        vector<vector<int>> c(len1 + 1, vector<int>(len2 + 1, 0));   #初始化(len1+1)个vector<int>(len2 + 1, 0)
                        for (int i = 0; i <= len1; i++) {  
                            for (int j = 0; j <= len2; j++) {  
                                if (i == 0 || j == 0) {  
                                    c[i][j] = 0;  
                                 }  
                                else if (str1[i - 1] == str2[j - 1]) {  
                                    c[i][j] = c[i - 1][j - 1] + 1;  
                                }  
                                else if (c[i - 1][j] >= c[i][j - 1]){  
                                    c[i][j] = c[i - 1][j];  
                                }  
                                else{  
                                    c[i][j] = c[i][j - 1];  
                                }  
                            }  #for (int j = 0; j <= len2; j++) {
                        }  #for (int i = 0; i <= len1; i++) {  
  
                return c[len1][len2];  
            }

LCS-最大公共子序列(DP问题)相关推荐

  1. LCS最大公共子序列【转载】

    在两个字符串中,有些字符会一样,可以形成的子序列也有可能相等,因此,长度最长的相等子序列便是两者间的最长公共字序列,其长度可以使用动态规划来求. 以s1={1,3,4,5,6,7,7,8},s2={3 ...

  2. 最大公共子序列、子串、可重叠重复子串

    最长公共子序列 寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的 举例:X=ABCBDAB,Y=BDCABA.序列 BCA是X和Y的一个公共子序列,但不是X和Y的最长 ...

  3. buct oj 最大公共子序列问题

    问题 B 最大公共子序列问题 时间限制: 1 Sec  内存限制: 128 MB [提交] 题目描述 对序列X=(x1, x2, .., xm),定义其子序列为(xi1, xi2, .., xik), ...

  4. 最大公共字符串,最大公共子序列,编辑距离,myers等算法

    1 前言 这个4个算法比较相似,并且有以下相同点和不同点 2 异同点 以str1 = "ABCDEF" , str2="ZABCDZE" 为例 相同点: 1.都 ...

  5. 【codevs1048】【codevs115406TG】石子归并、能量项链,序列dp的典型题目

    1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并 ...

  6. DP-最大递增子序列与最大递增子数组; 最大公共子序列与最大公共子数组。

    这些都是动态规划的题目. 解决动态规划的题目有个重点就是找出递推方程. 但问题在于递归方程不是那么好找的.如何恰当的定义目标函数是最大的难点. 如最大公共子数组中可定义A[m][n]为以A[m] B[ ...

  7. 递归法:求两个串的最大公共子序列的长度

    问题:求两个串的最大公共子序列的长度 举例: 子串: abcgxs 与sabxfh 其最大公共子序列的为abx,长度为3 public class Zixulie {public static int ...

  8. 【NOIP训练】塔防游戏 序列DP / 数据结构

    题 有 n n n 座塔标号为 1−n" role="presentation" style="position: relative;">1−n ...

  9. 穷举法求最大公共子序列C语言,算法--最长公共子序列(LongestCommon Subsequence, LCS)...

    定义: 两个字符串共有的最长的子序列(可不连续),最长公共字符串(Longest CommonSubstring)是两个字符串共有的最长的连续字符串. 方法:穷举法,动态规划 动态规划法的简介: &l ...

  10. python实现最大公共子序列

    介绍 子序列和子串的意思不一样,如下图所示,子序列不要求连续,只需要在给定序列中出现过,并且相对顺序一致.而子串需要连续. 图片来自动态规划 最长公共子序列 过程图解 最长公共子序列(LCS): 同时 ...

最新文章

  1. 可见光能量范围_通过能量转移技术实现双功能金属有机框架中分子马达的可见光驱动旋转...
  2. 地理坐标xy表示什么_建筑测量xy坐标的区别
  3. hdu 4632 子字符串统计的区间dp
  4. A、B、C、D四个字母,能组成多少个互不相同且无重复三位组合
  5. 感恩工作平台心得体会_感恩有你,一路同行——石龙联社组织举办10月份员工集体生日会...
  6. abb限位开关已打开drv1_施工升降机上有10个限位器,你都知道了吗?
  7. Python学习笔记:Day 10 用户注册和登陆
  8. SpringBoot/Cloud 统一返回优雅设计+自定义异常
  9. linux运维之道基础命令,Linux运维之道(7)——Linux管理类命令
  10. 前端给后端传递数据的时候,有些后端自己可以获取到的值应该由前端传递吗?
  11. 《数学之美》马尔科夫链的扩展-贝叶斯网络
  12. ZOJ 3988 2017CCPC秦皇岛 H:Prime Set(二分匹配)
  13. Unity3d UGUI 通用Confirm确认对话框实现(Inventory Pro学习总结)
  14. 输入时(hour)、分(minute)、秒(second)的一个具体时间,要求打印出它的下一秒出来(一天24小时)。 例如输入的是23时59分59秒,则输出00:00:00
  15. eNews 第二十七期/2007.08
  16. 中国大学mooc java_中国大学mooc2020年Java程序设计答案大全
  17. Mathmatica简介
  18. 【Win32 API】GetPixel函数返回的颜色值不正确
  19. 定制化电商方案+个性化营销 打造“无淡季”创新模式
  20. react-native系列(13)动画篇:Animated动画库和LayoutAnimation布局动画详解

热门文章

  1. jquery 逗号分割截取字符串_Python中常用的8种字符串操作方法
  2. 新公司要上监控,我决定用Prometheus
  3. 谷歌、阿里巴巴他们都来了,你呢?
  4. 少走弯路,给3~5年程序员的唯一一条建议
  5. 专题开发十三:JEECG微云快速开发平台-附录
  6. ADB wifi调试步骤
  7. 记录hadoop HDFS与hadoop YARN无法访问问题
  8. 关于CSS的碎片学习
  9. EasyUI中dialog中嵌入form细节问题记录
  10. linux下使用ThinkPHP注意大小写问题