3.5 最长公共子序列(LCS)

前言:图片是博主自己画的,转载请注明出处哦

3.5.1 问题描述

最长公共子序列(Longest Common Subseuence,LCS)问题:给定两个字符串,求解它们的最长公共子序列的长度,其中子序列是指:它是由原字符串在不改变字符的相对顺序的情况下,删除某些字符(也可以不删除任何字符)后组成的新字符串。

3.5.2 算法思路

简单地说,我们要填出下面这张表。

我们的目标是求出ABCBDAB和BDCABA的最长公共子序列。根据动态规划的原则,问题分阶段,那么最开始,我们可以看成求A和B、和BD…和BDCABA的最长公共子序列,这样就填出了第一行的值。

然后同样的道理,把第一列也填了。

这相当于基础工作,现在开始填写第二行。
归纳为:

  • 元素相同,则把左上角的值+1填入
  • 元素不同,则把相邻的上边和左边,这两格中最大的那一个数填入。

按照同样的道理,我们可以把整张表填完。这张表最右下角的值,就是最长公共子序列的长度

现在来求解最长公共子序列,因为最长公共子序列不唯一,我们这里就只求出一条路径

按照这样的原理,我们找出了一条路径。
根据填表原理,我们可以容易地看出一条最长公共子序列BCBA。当然,你也可以直接记忆为,谁往左上角走,就选谁,以及最后一个元素必须选,这样选中的就是最长公共子序列

3.5.3 表格法代码实现

public static String getLCSByTabulation(String str1, String str2){int row = str1.length();int col = str2.length();int [][] board =new int[row][col];board[0][0] = (str1.charAt(0)==str2.charAt(0))?1:0;/*核心代码*/for(int i=1;i<row;i++){//初始化第一列board[i][0] = (str1.charAt(i)==str2.charAt(0)|| board[i-1][0]==1)?1:0;}for (int j=1;j<col;j++){//初始化第一行board[0][j] = (str1.charAt(0)==str2.charAt(j)|| board[0][j-1]==1)?1:0;}for(int i=1;i<row;i++){for(int j=1;j<col;j++){if(str1.charAt(i)==str2.charAt(j)){//如果字符相同board[i][j]=board[i-1][j-1]+1;//等于左上角值+1}else{//字符不同board[i][j]=Math.max(board[i-1][j],board[i][j-1]);//继承上面或左边一个的最大值}}}int i=row-1,j=col-1;String lcs="";while(i!=0&&j!=0){/*核心代码*/if(board[i][j]==board[i-1][j])//值和左边一格相同 i--;else if(board[i][j]==board[i][j-1])//值和上边一格相同 j--;else{//值来自左上角一格+1lcs = str1.charAt(i)+lcs;//这个元素是LCS的元素i--;j--;}}lcs=str1.charAt(i)+lcs;//到头啦,加上最后一个元素return lcs;
}

3.5.4 算法复杂度

算法复杂度:(mn)

动态规划表格法解决最长公共子序列(LCS)问题相关推荐

  1. 动态规划解决最长公共子序列

    动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...

  2. 动态规划算法解最长公共子序列LCS问题

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

  3. [Leetcode][第1143题][JAVA][最长公共子序列][LCS][动态规划]

    [问题描述][中等] [解答思路] 时间复杂度:O(N^2) 空间复杂度:O(N^2) class Solution {public int longestCommonSubsequence(Stri ...

  4. 算法导论-----最长公共子序列LCS(动态规划)

    目录 一.概念梳理 二.最长公共子序列解决方案 方案1:蛮力搜索策略 方案2:动态规划策略 三.C代码实现 实现1 实现2(空间优化) 一.概念梳理   1. 子序列(subsequence): 一个 ...

  5. 动态规划解最长公共子序列(LCS)(附详细填表过程)

    目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...

  6. 动态规划算法之:最长公共子序列 最长公共子串(LCS)

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

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

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

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

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

  9. 算法设计-递归法解最长公共子序列问题 C代码

    给大家推荐一个公众号:诗葵1931 里面的诗歌很美 主要功能:递归法解最长公共子序列问题 #include<stdio.h> #include<string.h> /* 递归思 ...

最新文章

  1. 二叉树的层序遍历和二叉树的线索化
  2. php代码清除空格注解,PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
  3. 巧用代理设计模式(Proxy Design Pattern)改善前端图片加载体验
  4. koa --- 使用Sequelize连接mysql
  5. MySQL--开发技巧(一)
  6. 为什么火狐浏览器中点击按钮失效_各种浏览器审查、监听http头工具介绍
  7. js 验证用户输入的是否为数字、检查只能为数字
  8. Nginx - 代理、缓存
  9. mysql远程定时任务_Linux下定时任务实现mysql自动备份并上传远程ftp
  10. Fiddler——自动响应器设置——URL重定向
  11. python使用默认参数
  12. 清华计算机网络所教授张,2019计算机考研清华大学计算机网络技术研究所简介...
  13. 20科大考研经验分享-数学
  14. 自己动手修理单击变双击的鼠标
  15. android多点触控参数,转 android 下的webview 设置多点触控放大
  16. 端电压,相电压,线电压区别
  17. 艾默生质量流量计调试
  18. Windows 11 电脑如何设置自动开机 (Windows 11 2022H2)
  19. linux安装教程以及使用时遇到的问题和解决方法
  20. 常见比较好用的winpe系统有哪几款?

热门文章

  1. 浅谈常见的七种加密算法及实现
  2. [Delphi]Delphi中的ODBC和ADO
  3. 普通人如何做到“我命由我不由天”
  4. 计算机组成原理真值的补码,计算机组成原理:真值,原码,补码,反码,移码...
  5. 网站分析工具使用方法的介绍,快速高效提高网站分析效率
  6. 网站分析软件Umami
  7. CodeBlocks编译环境配置及调试问题
  8. jQuery写突出显示
  9. 计算机组装与拆解中容易混淆的知识点,教资干货 | 教资笔试中易混淆的知识点整合...
  10. 此网络中的另一台计算机的ip相同,同一Wi-Fi网络上的两台计算机具有相同的IP地址吗?...