最长公共子序列 - 北京大学郭炜 动态规划代码详解

解题思路:
该题可用动态规划解决。动态规划需要我们找出子问题
假设我们输入两个字符串:

ACTTGACC CGTT

那么如何通过动态规划算出其最大公共子序列的长度呢?

建立如上二维数组,我们可以知道:
A和C的最长公共子序列为 0;
AC和C的最长公共子序列为 1;
ACT和C的最长公共子序列为 1;
……
ACTTGACC和C的最长公共子序列为 1;


A到CG的最长公共子序列为 0;
AC到CG的最长公共子序列为 1;
……
ACTTG到CG的最长公共子序列为 2;
……

我们大致可以看出子问题的规律:
设str1=ACTTGACC,str2=CGTT
建立二维数组 maxLen[str1.size()][str2.size()]
第一种情况:
当子串末位元素不相等时:

则需要通过判断maxLen[ i ][ j ]上方和左方的元素哪一个更大,选择更大的数值作为maxLen[ i ][ j ]的值。
因为AC到C的最长上升子序列为1,A到CG的最长上升子序列为0,则AC到CG的最长上升子序列必定是AC到C或A到CG中比较大的那个值。

第二种情况:
当子串末位元素相等时:

则需要将maxLen[ i ][ j ]左上方的元素+1赋给maxLen[ i ][ j ];
因为ACTT和C的最长上升子序列为1,那么ACTTG和CG的最长上升子序列必定是ACTT和C的最长上升子序列+1,即1+1 = 2;

根据上面这两种情况,我们可以写出伪代码:

if (a === b) {table[row][col] = table[row - 1][col - 1] + 1;
} else {table[row][col] = Math.max(table[row][col - 1], table[row - 1][col]);
}

求到最后,我们便可以得知ACTTGACC和CGTT的最长公共子序列的长度为3。

思考:为什么表格第2行以及第2列需要初始化为0?
主要是方便我们在扫描子串的过程中,即使在表格边缘,也可以用上面我们所讲到的方式去判别边缘格子中的数字应该是几。

代码:

#include "iostream"
using namespace std;
int main(){string str1,str2;cin>>str1>>str2;//【易错】构建一个str1.size()行,str2.size()列的矩阵int maxLen[str1.size()+1][str2.size()+1];//【下标易错】初始化表格for (int i=0;i<=str2.size();i++){maxLen[0][i] = 0;}for (int j=0;j<=str1.size();j++){maxLen[j][0] = 0;}for (int i = 1;i<=str1.size();i++){for (int j = 1;j<=str2.size();j++){if (str1[i-1]==str2[j-1]){//子串末尾元素相等,则把左上角元素+1后赋值给该位置maxLen[i][j] = maxLen[i-1][j-1] + 1;} else {//子串末尾元素不相等,则找左边和上边相邻元素做判断,//把最大值赋值给该位置maxLen[i][j] = max(maxLen[i][j-1],maxLen[i-1][j]);}}}cout<<maxLen[str1.size()][str2.size()];
}

最长公共子序列 - 北京大学郭炜 动态规划代码详解相关推荐

  1. 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我)

    目录 最长公共子序列(LCS)问题 1.朴素做法 O(n2)O(n^2)O(n2) 2.转换成LIS优化O(nlogn)O(nlogn)O(nlogn) 3.P2758 编辑距离 最长公共子序列(LC ...

  2. 用动态规划解决最长公共子序列问题 C语言,动态规划之最长公共子序列问题 C++实现...

    这个问题经常运用在判断两种生物的相似度--DNA比对上.对比俩串的方式有很多种,例如如果一个串是另一个的字串,那么可以说两个串是相似的:如果将一个串转换为另一个串的操作很少,那么也可以说这两个串是相似 ...

  3. 【LeetCode笔记】1143. 最长公共子序列(Java、动态规划、字符串)

    文章目录 题目描述 思路 & 代码 二刷 三刷 题目描述 算是很高频的面试题了,而且题号还挺后的 思路 & 代码 注意:dp[i]][j] 和 charAt(i) 有1的下标差(dp初 ...

  4. LCS最长公共子序列和LIS最长上升子序列——例题剖析

    一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...

  5. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  6. 算法:动态规划——最长公共子序列

    文章目录 一.动态规划概念 1. 动态规划步骤 最长公共子序列问题 题目 示例 分析 代码(递归) 查表 打印最长公共子序列 一.动态规划概念 动态规划算法与分治法类似,其基本思想也是将待求解问题分解 ...

  7. 动态规划---最长公共子序列

    1.问题描述 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切的说,若给定序列X={x1,x2,-,xm},则另一序列Z={z1,z2,-,zk},X的子序列是指存在一个严格递增下标序列 ...

  8. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

    Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...

  9. 最长公共子序列及其引申问题

    最长公共子序列是经典的动态规划问题,在很多书籍和文章中都有介绍,这里对这一经典算法进行回顾并对两个follow up questions进行总结和分析. 1. 回顾LCS(longest common ...

最新文章

  1. 参加web前端培训需要注意什么
  2. 关于C语言中的结构体内存对齐与位段问题
  3. 用池来提升对象的复用
  4. nodeJs 是什么?你需要先想清楚这个问题,才能学习nodejs (介绍)
  5. 数据结构---后序和中序遍历的二叉树序列还原二叉树
  6. mysql sum_MySQL中的SUM函数使用教程
  7. python缺少标准库_Python 实现自动导入缺失的库
  8. Master HA源码解析
  9. 打击侵犯公民个人信息罪的司法困境
  10. JEECG 3.7.8 补丁代码提交通知
  11. 华为qy2音乐如何转换为mp3_华为手机还有这种骚操作?开启这个功能,让你体验至尊级待遇...
  12. 炸了!!又一 VSCode 神器面世!
  13. ubuntu 外置硬盘安装
  14. 信捷PLC Modbus通讯 (Modbus_TCP与Modbus_RTU)
  15. 配置交叉编译工具链(imx6ull pro)
  16. 伺服电机转矩常数的标定方法
  17. FPGA之通信算法工程师面试题3
  18. sharepoint文档库文件下载
  19. 51nod 1682
  20. PhantomJS的安装

热门文章

  1. EssentialC++_chapter06 binary tree 的学习笔记记录及问题
  2. 潢川高中2021高考成绩查询,信阳市教育体育局官网2021潢川中招成绩查询系统
  3. 细数后台开发的技术栈
  4. [数据分析自学帮手]数据分析必备的统计学知识大梳理,还不赶紧收藏?
  5. 云承软件和云溪哪个好_QQCMS系统发生错误
  6. 给React初学者的10分钟ES6教程
  7. 来客推电商快报|微信小程序取名字有什么规范
  8. 2019上海交大计算机机试题
  9. [转载]数学的三大核心领域
  10. springboot配置类简要