问题描述:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。比如:text1 = "abcde", text2 = "ace" ,最长公共子序列是 "ace",它的长度为 3。

算法思路:

  1. 明确 dp 数组的含义:对于两个字符串的动态规划问题,套路是通用的。比如说对于字符串 s1 和 s2,它们的长度分别是 m、n,一般来说都要构造一个这样的 DP table:int[][] dp = new int[m+1][n+1]。这里为什么要加1,原因是你可以不加1,但是不加1你就会用其它限制条件来确保这个index是有效的,而当你加1之后你就不需要去判断只是让索引为0的行和列表示空串。
  2. 定义 base case:我们专门让索引为0的行和列表示空串,dp[0][...] 和 dp[...][0] 都应该初始化为0,这就是base case。
  3. 找状态转移方程:这是动态规划最难的一步,我们来通过案例推导出来。对于 text1:abcde 和 text2:ace 两个字符串,我们定义两个指针进行遍历 i 和 j。遍历 text1 长度为 m,定义指针 i,从 0~m。固定 i 指针(i == 1)位置,接下来开始遍历 text2 长度为 n,定义指针 j,从 0~n。

我们会发现遍历两个串字符,当不同时需要考虑两层遍历前面的值(关系传递),也就是左边和上边的其中较大的值,当想相同时,需要考虑各自不包含当前字符串的子序列长度,再加上1。因此可以得出:

现在对比的这两个字符不相同的,那么我们要取它的「要么是text1往前退一格,要么是text2往前退一格,两个的最大值」:dp[i + 1][j + 1] = Math.max(dp[i+1][j], dp[i][j+1]);

对比的两个字符相同,去找它们前面各退一格的值加1即可:dp[i+1][j+1] = dp[i][j] + 1;

class Solution {public int longestCommonSubsequence(String text1, String text2) {int m = text1.length(), n = text2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 获取两个串字符char c1 = text1.charAt(i), c2 = text2.charAt(j);if (c1 == c2) {// 去找它们前面各退一格的值加1即可dp[i + 1][j + 1] = dp[i][j] + 1;} else {//要么是text1往前退一格,要么是text2往前退一格,两个的最大值dp[i + 1][j + 1] = Math.max(dp[i + 1][j], dp[i][j + 1]);}}}return dp[m][n];}
}

动态规划—最长公共子序列相关推荐

  1. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence

    动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...

  2. 详解动态规划最长公共子序列--JavaScript实现

    前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...

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

    动态规划1--最长公共子序列 一.动态规划 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并 综合子问题的解导出大问题的解的方法,问题求解耗时 ...

  4. 最长公共子序列php,动态规划(最长公共子序列LCS)

    概念 求解决策过程最优化的结果 (可能有多个) 把多阶段过程转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解 计算过程中会把结果都记录下,最终结果在记录中找到. 举例 求两个字符串的最长公共子序 ...

  5. 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)

    最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...

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

    1. 子序列 摘自维基百科 在数学中,某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置而形成的新序列. 例如: 令 为一序列 那么,以下序列 是 的子序列之一.对应定义里的自然数 ...

  7. 动态规划——最长公共子序列(LCS)

    最长公共子序列的问题描述为: 下面介绍动态规划的做法. 令 dp[i][j] 表示字符串 A 的 i 号位与字符串 B 的 j 号位之前的 LCS 长度(下标从 1 开始),如 dp[4][5] 表示 ...

  8. 算法导论之动态规划(最长公共子序列和最优二叉查找树)

    动态规划师通过组合子问题的解而解决整个问题,将问题划分成子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解.和分治算法思想一致,不同的是分治算法适合独立的子问题,而对于非独立的子问题,即各 ...

  9. 【啃不完的算法导论】- 动态规划 - 最长公共子序列(概念篇)

    以下内容纯是为了熟悉<算法导论>中的内容,高手可略过,其中涉及的书本内容的版权归原作者.译者.出版社所有 ========================================= ...

最新文章

  1. 动力节点Java培训告诉你Java线程的多功能用法
  2. html5关于定位功能的实现
  3. LeetCode--014--最长公共前缀(java)
  4. 解决PHP下载文件名中文乱码
  5. cognos安装教程linux,linux环境下安装cognos10.2.1(菜鸟安装)
  6. 聊聊高并发(二十四)解析java.util.concurrent各个组件(六) 深入理解AQS(四)
  7. SAP CRM SPRO Customizing 里 Text Object 属性 continue 的含义
  8. hdu1355The Peanuts
  9. 高服从编纂器 VIM-操作篇(1)
  10. 表单标签 input
  11. pingback协议与traceback协议的区别
  12. python中颜色表_python 颜色表
  13. 云时代,最好用的MySQL客户端工具推荐
  14. linux gif录制工具,Linux下的GIF录制
  15. Unity3D 游戏开发学习资料(不断更新中。。。)
  16. Svelte 实现 keypress 快捷键功能
  17. SwiftUI 手势操作
  18. dw php用文本框更新记录,用dreamweaver htm的网页 一个输入框 一个按钮 点按钮将输入框中的内容保存到本地 肿么写...
  19. [BUUCTF-pwn] qwb2018_opm
  20. 【工控安全产品】工业控制系统信息安全检查工具箱

热门文章

  1. 超全!整理常用的iOS第三方资源
  2. [网摘]关于产品运营
  3. Effective C++条款01: 视C++为一个语言联邦
  4. Webservice初接触
  5. Android判断一个Service是否运行
  6. bzoj 4566 找相同字符 —— 广义后缀自动机
  7. 【第一季】CH07_FPGA_RunLED创建VIVADO工程实验
  8. numpy 辨异(二) —— np.identity()/np.eye()
  9. Newtonsoft.Json(Json.Net)学习笔记
  10. Java异常处理和常用类