介绍

子序列和子串的意思不一样,如下图所示,子序列不要求连续,只需要在给定序列中出现过,并且相对顺序一致。而子串需要连续。

图片来自动态规划 最长公共子序列 过程图解

最长公共子序列(LCS):

同时出现在两个字符串中的最长子序列

实现

1143. 最长公共子序列

思想和求解两个字符串之间的编辑距离差不多,使用动态规划的方法,递推公式如下:

dp[i,j]dp[i, j]dp[i,j]表示字符串x[:i]x[:i]x[:i]与字符串y[:j]y[:j]y[:j]之间的最长公共子序列长度

dp[i,j]={0若 i=0或 j=0dp[i−1,j−1]+1若 i,j≥0,xi−1=yj−1max⁡{dp[i,j−1],dp[i−1,j]}若 i,j≥0,xi−1≠yj−1dp[i, j]= \begin{cases}0 & \text { 若 } i=0 \text { 或 } j=0 \\ dp[i-1, j-1]+1 & \text { 若 } i, j\geq0, x_{i-1}=y_{j-1} \\ \max \{dp[i, j-1], dp[i-1, j]\} & \text { 若 } i, j\geq0, x_{i-1} \neq y_{j-1}\end{cases} dp[i,j]=⎩⎪⎨⎪⎧​0dp[i−1,j−1]+1max{dp[i,j−1],dp[i−1,j]}​ 若 i=0 或 j=0 若 i,j≥0,xi−1​=yj−1​ 若 i,j≥0,xi−1​​=yj−1​​

代码如下:

class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m = len(text1)n = len(text2)res = ""# 记录最长的公共子序列if m * n == 0:return 0dp = [[0] * (n + 1) for _ in range(m + 1)]# dp[i][j]表示text1[:i]与text[:j]的最长公共子序列长度for i in range(1, m + 1):for j in range(1, n + 1):if text1[i - 1] == text2[j - 1]:dp[i][j] = dp[i - 1][j - 1] + 1res += text1[i - 1]else:dp[i][j] = max([dp[i - 1][j], dp[i][j - 1]])print(res)return dp[m][n]

时间复杂度:O(mn)
空间复杂度:O(mn)

测试:

text1 = "abcde"
text2 = "ace"
obj = Solution()
res = obj.longestCommonSubsequence(text1, text2)
print(res)
# 3,最长公共子序列是ace
# ace 可以在计算dp的过程中保存得到

上面的代码中,dp只需要用到上一行i-1的结果,因此可以进行空间优化,只保存上一行以及当前行的结果。

class Solution:def longestCommonSubsequence_1(self, text1: str, text2: str) -> int:m = len(text1)n = len(text2)res = ""# 记录最长的公共子序列if m * n == 0:return 0dp = [[0] * (n + 1) for _ in range(2)]# dp[i][j]表示text1[:i]与text[:j]的最长公共子序列长度pre = 0cur = 1# pre存储上一行的结果,cur存储当前行结构# pre和cur在内存中的位置一会是第0行,一会是第1行for i in range(1, m + 1):for j in range(1, n + 1):if text1[i - 1] == text2[j - 1]:dp[cur][j] = dp[pre][j - 1] + 1res += text1[i - 1]else:dp[cur][j] = max([dp[pre][j], dp[cur][j - 1]])tmp = prepre = curcur = tmpprint(res)return dp[pre][n]

时间复杂度:O(mn)
空间复杂度:O(2n)

python实现最大公共子序列相关推荐

  1. python生成递增序列_Python的6种内建序列之通用操作

    数据结构式通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence).序列中的每 ...

  2. python中的序列总结:列表,元组,字符串

    首先python中的序列有列表,元组,字符串. 列表List是python里面最基本的数据结构.序列中每个元素都是从索引(下标)从0开始,依次叠加. List操作的方法很多,只能熟悉基本常用的这个方法 ...

  3. python 生成001开始的序号_你知道嘛:Python内建序列通用操作有6种实现方法(赶快收藏)...

    本文内容主要介绍了Python内建序列通用操作6种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 数据结构式通过某种方式(例如对元素进 ...

  4. Python 中的序列类型支持哪些公共操作

    一.序列类型支持哪些公共操作 Python 中的序列类型分为:可变序列和不可变序列,都支持我们序列类型的所有操作 可变序列:列表 不可变序列:字符串和元祖 1.支持通过数字索引取值 a = (&quo ...

  5. python 中的序列

    python 中的序列 序列概述 Python 内置了多种序列,比如列表.元组和字符串. 列表和元组的主要不同在于:列表是可以修改的,而元组不可以. 在需要处理一系列值时,序列很有用.在数据库中,你可 ...

  6. Python中的序列操作

    Python中的序列操作 分类: python undefined 官方手册:https://docs.python.org/3.7/library/stdtypes.html#sequence-ty ...

  7. Python 集合、序列基础知识

    集合 Python 中set与dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key. key为不可变类型,即可哈希的值. num = {} p ...

  8. python慕课笔记_MOOC python笔记(三) 序列容器:字符串、列表、元组

    Python Python开发 Python语言 MOOC python笔记(三) 序列容器:字符串.列表.元组 容器概念 容器是Python中的重要概念,分为有序与无序. 有序容器也称为序列类型容器 ...

  9. python中的序列类型数据结构元素的切片操作_浅析python中的分片与截断序列

    浅析python中的分片与截断序列 序列概念 在分片规则里list.tuple.str(字符串)都可以称为序列,都可以按规则进行切片操作 切片操作 注意切片的下标0代表顺序的第一个元素,-1代表倒序的 ...

最新文章

  1. MCU(多点控制单元)
  2. CNN和VGGNet-16背后的架构
  3. python教程是用什么博客写的-用Python和Pygame写游戏-从入门到精通(目录)
  4. mysql alert table 日志_MySQL日志
  5. Postman常用方法
  6. 将可执行文件加入到系统启动项中
  7. 【单片机】51单片机烧录那些事儿
  8. 有意义的100个小故事
  9. 华为云服务器安装win10系统,云服务器安装win10
  10. php 多版本 安装包下载,wamp 安装多版本php
  11. 自动化测试设计模之PO(PageObject)
  12. foxmail远程主机强迫关闭了一个现有的连接
  13. 数据分析项目:用户消费行为分析
  14. 美国访问学者申请签证存款证明相关事宜
  15. 单片机c语言100例 的案例,51单片机C语言100个实例 [推荐下载】
  16. ug10.0许可证服务器失败,ug10.0许可错误
  17. c语言模拟石头 剪子布游戏,用C++如何做出石头剪刀布的游戏。。。初学者不给力啊...
  18. Linux 创建线程 段错误,linux下线程池,出现Segmentation fault (core dumped) 问题
  19. 洗料系列-杂谈篇-麻将自动化---第一章、麻将基础入门
  20. 开车是一场修行 安全驾驶的智慧 作者梦飞 柳实

热门文章

  1. 一起谈.NET技术,用NuGet掌管你的Visual Studio扩展
  2. Google Native Client介紹
  3. php.ini添加的变量读取,PHP5 在扩展里使用 INI 指令(直接添加和配合全局变量两种方式)...
  4. pythonmkdir语法错误_Python:windows创建文件夹时出错操作系统.mkdir使用方括号
  5. 读取4:2:0格式YUV序列的Y分量、U分量以及V分量,并分别保存为.yuv格式(matlab实现)
  6. Java21天打卡day19-异常
  7. Python21天打卡Day11-dict和json格式互转
  8. 25岁房贷上万濒临失业,大专小哥转行软件测试“挽救”人生
  9. 如何用禅道写出一份让开发膜拜的测试用例?超神级测试用例库
  10. APP UI自动化测试:框架选择、环境搭建、脚本编写……全总结