Python面试宝典第26题:最长公共子序列
题目
一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。比如:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的公共子序列是这两个字符串所共同拥有的子序列。
现给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列 ,返回0。
备注:text1 和 text2 仅由小写英文字符组成。
示例 1:
输入:text1 = "abcde", text2 = "ace"
输出:3
解释:最长公共子序列是"ace" ,它的长度为3。
示例 2:
输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是"abc",它的长度为3。
示例 3:
输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回0。
递归法
最长公共子序列,英文全称为Longest Common Subsequence,一般缩写为LCS。
递归法求解LCS的基本思想是:将大问题分解为小问题,通过比较两个字符串的末尾字符是否相等,来决定如何递归地解决问题。如果两个字符串的末尾字符相等,那么这个字符必定属于LCS的一部分。如果不相等,就需要分别去掉一个字符串的末尾字符,递归地求解子问题。使用递归法求解本题的主要步骤如下。
1、如果任意一个字符串为空,那么最长公共子序列的长度为0。
2、如果 text1 的最后一个字符和 text2 的最后一个字符相同,那么我们递归地求解 text1[:-1] 和 text2[:-1] 的LCS长度,并在结果上加1。
3、如果 text1 的最后一个字符和 text2 的最后一个字符不同,那么我们递归地求解 text1[:-1] 和 text2 的LCS长度,以及 text1 和 text2[:-1] 的LCS长度,取两者中较大的一个。
根据上面的算法步骤,我们可以得出下面的示例代码。
def lcs_by_recursion(text1, text2):def lcs_helper(t1, t2):if not t1 or not t2:return 0if t1[-1] == t2[-1]:# 末尾字符相同return lcs_helper(t1[:-1], t2[:-1]) + 1else: # 末尾字符不同return max(lcs_helper(t1[:-1], t2), lcs_helper(t1, t2[:-1]))return lcs_helper(text1, text2)print(lcs_by_recursion("abcde", "ace"))
print(lcs_by_recursion("abc", "abc"))
print(lcs_by_recursion("abc", "def"))
动态规划法
动态规划法通过构建一个二维数组来存储子问题的解,以避免重复计算。对于任意两个字符串的前缀,其最长公共子序列的长度取决于前一个字符是否相等:如果相等,则长度加1;如果不等,则取两者可能的最长公共子序列的最大值。使用动态规划法求解本题的主要步骤如下。
1、初始化。定义一个二维数组 dp,大小为 (len(text1) + 1) x (len(text2) + 1)。初始状态下,dp[0][j] = 0,dp[i][0] = 0。这是因为,空字符串与任何字符串的最长公共子序列长度都为0。
2、状态转移方程。遍历 text1 和 text2 的每个字符,对于 text1 中的第 i 个字符和 text2 中的第 j 个字符,进行以下操作。
(1)如果 text1[i-1] 等于 text2[j-1],则 dp[i][j] = dp[i-1][j-1] + 1。
(2)如果 text1[i-1] 不等于 text2[j-1],则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
3、边界条件。当任一字符串为空时,最长公共子序列长度为0,这已经在初始化时处理。
4、获取结果。最终答案位于dp数组的右下角,即:dp[len(text1)][len(text2)]。
def lcs_by_dp(text1: str, text2: str) -> int:m, n = len(text1), len(text2)# 初始化DP表dp = [[0] * (n + 1) for _ in range(m + 1)]# 填充DP表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] + 1else:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])return dp[m][n]print(lcs_by_dp("abcde", "ace"))
print(lcs_by_dp("abc", "abc"))
print(lcs_by_dp("abc", "def"))
总结
虽然递归法直观且易于理解,但它存在严重的重复计算问题,导致时间复杂度为指数级,效率极低。因此,在实际应用中,递归法通常被动态规划法所替代。动态规划法可以避免重复计算,将时间复杂度降低至O(m*n),其中m和n分别是两个字符串的长度。
相关文章:
Python面试宝典第26题:最长公共子序列
题目 一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。比如:"ace" 是 "abcde" 的子序列,但 "…...
接口测试学习笔记2
一、复习和扩展: 1、金字塔测试模型 UI测试 -- 黑盒 Service 服务层--函数之间的调用 灰盒 接口测试 Unit单元层--白盒测试 趋势:逐步向下发展 测试优先、测试驱动 -- 先考虑怎么测,再考虑怎么开发 满足软件测试的可控范围 2、…...
vue3修改带小数点的价格数字:小数点的前后数字,要分别显示成不同颜色和大小!已经封装成组件了!
需求: 修改带小数点的价格数字:小数点的前后数字,要分别显示成不同颜色和大小!已经封装成组件了! 效果: 前面大,后面小 代码: 组件: <!--修改小数点前后数字不同…...
JVM(Java虚拟机) - JVM内存分配与内存管理
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 Java虚拟机&…...
Linux中vim的基本介绍和使用
善为理者,举其纲,疏其网。 vim 1、vim介绍2、命令模式详情3、底行模式详情4、困难问题5、历史存疑问题6、vim配置问题6、1、配置的原理6、2、一键式配置 1、vim介绍 如果我面想要在Linux上编写代码的话,我就需要vim来帮助我们编写代码。但是…...
宝塔面板上,安装rabbitmq
废话不多说,直接上干货! 第一步:登录宝塔账号,在软件商店里搜索 第二步:点击设置 第三步:已经完成了,还看啥!...
【Docker系列】Docker 镜像管理:删除无标签镜像的技巧
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
数据采集器
目录 1. 采集Redis 2. 采集MySQL 3. 采集容器 1. 采集Redis 出口商和集成 |普罗 米修斯 (prometheus.io) 发布 奥利弗006/redis_exporter (github.com) 在目标机器上安装redis 上传redis采集器包redis_exporter-v1.53.0.linux-amd64.tar.gz [rootharbor opt]# tar -xf …...
小红书0510笔试-编程题
解题思路: 先射击左边和先射击右边两种情况,就是2*1/n*(n-1)的概率。 解题思路: 枚举所有的评论作为最小值,按评论从大到小排序,每次遍历到的都是最小值。要想得到以该评论为最小值的最大优秀度,就要维护一…...
2024年热门开放式耳机评测!悠律、韶音、声阔到底该选谁?
开放式耳机选购技巧篇,可参考选购! 作为一名数码评测博主,这两年用过的开放式耳机不下50款了,市面上的开放式耳机众多,很多人不知道该如何选择,其实选购都是有一定的技巧和规律性的,看配置就能…...
计算机毕业设计选题推荐-智慧物业服务系统-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
新手小白学习PCB设计,立创EDA专业版
本教程有b站某UP主的视频观后感 视频链接:http://【【教程】零基础入门PCB设计-国一学长带你学立创EDA专业版 全程保姆级教学 中文字幕(持续更新中)】https://www.bilibili.com/video/BV1At421h7Ui?vd_sourcefedb10d2d09f5750366f83c1e0d4a…...
查物流信息用什么软件
在电子商务日益繁荣的今天,快递物流信息的查询成为了我们日常生活中不可或缺的一部分。无论是网购达人还是商家,都需要随时掌握货物的物流动态。然而,如何快速、准确地查询物流信息却是一个令人头疼的问题。今天,我将为大家介绍一…...
(40)温度传感器
文章目录 前言 1 设置 2 记录 3 参数说明 前言 ArduPilot 已经有许多可能的温度报告来源:电调,智能电池,电机 EFI,这些独立的传感器可以用来取代 ArduPilot 中已经存在的那些设备温度报告。它们也可以只是被记录下来。 ArduP…...
【靶场实操】sql-labs通关详解----第二节:前端页面相关(Less-11-Less-17)
SQL注入攻击是一种针对Web应用程序的安全漏洞,那么自然,SQL注入攻击也和前端页面息息相关,用户输入未被正确处理、动态查询的构建、前端JavaScript代码错误,等等我问题都可能造成安全威胁。 在上一节,我们了解了基础的…...
样式与特效(2)——新闻列表
1.盒子模型的边距概念 ) Margin-top 上面 Margin-bottom 底部 Margin-right 右边 Margin-left 左边 Margin : 10px (上下左右都是10px) Margin :10px,20px (上下边距10px 左右20px) CSS里面最重要的属性之一 将页面理解成…...
NICE Seminar(2023-07-16)|演化算法的理论研究到底有什么用?(南京大学钱超教授)
模式定理(Schema Theorem) 模式定理(Schema Theorem)是遗传算法(Genetic Algorithm, GA)的重要理论基础,由约翰霍兰德(John Holland)在1975年提出。它描述了具有特定模式…...
优盘驱动器未格式化?数据恢复全攻略
在数字时代,优盘作为便携的数据存储工具,广泛应用于日常生活与工作中。然而,当遇到“优盘驱动器未被格式化”的提示时,无疑给许多人带来了不小的困扰。这一状况往往意味着优盘的文件系统出现了问题,导致系统无法正确识…...
(超全)Kubernetes 的核心组件解析
引言 在现代软件开发和运维的世界中,容器化技术已经成为一种标志性的解决方案,它为应用的构建、部署和管理提供了前所未有的灵活性和效率。然而,随着应用规模的扩大和复杂性的增加,单纯依靠容器本身来管理这些应用和服务已不再足够…...
前端常用的【设计模式】和使用场景
设计原则 最重要的:开放封闭原则 对扩展开放对修改封闭 工厂模式 用一个工厂函数,来创建实例,隐藏 new 如 jQuery 的 $ 函数,React 的 createElement 函数 单例模式 全局唯一的实例(无法生成第二个) 如 Vuex 和 Redux 的 store…...
QT下载问题:Download from your IP address is not allowed
问题 Download from your IP address is not allowed 解决 https://download.csdn.net/download/baidu_34971492/89608794...
自建数据库VS云数据库
自建数据库VS云数据库 什么是自建数据库?自建数据库方案自建数据库的优点自建数据库的缺点什么是云数据库?自建数据库的缺点什么是云数据库? 云数据库方案云数据库的优点云数据库的缺点适用场景比较总结 【纪录片】中国数据库前世今生 在数字…...
【大数据开发语言Scala的入门教程】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🪁Scala 🪡Scala是一种功能丰富且具有强大表达能力的静态类型…...
docker部署kkfileview文件在线预览服务
kkfileview文件在线预览服务部署使用 免费开源,功能强大,几乎支持日常见到的所有文件类型在线预览 目前支持的文件类型如下 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla 等 Office 办公文档支持 wp…...
朱锐 | 生命图像中的时间和意识
本文载于《科学・经济・社会》2023 年第 41 卷第 2 期第 37~61 页 作者简介: 朱锐(1968年10月—2024年8月1日),中国人民大学哲学院杰出学者、特聘教授,美国德州州立大学客座教授,主要从事神经哲学、心灵哲…...
pytorch: cpu,cuda,tensorRt 推理对比学习
0:先看结果 针对resnet模型对图片做处理 原图结果 分别使用cpu,cuda,TensorRt做推理,所需要的时间对比 方法时间cpu13s594mscuda711mstensorRt 113ms 项目地址: GitHub - july1992/Pytorch-vily-study: vily 学…...
android 音频播放器,(一)SoundPool音频播放实例
1. Apk内,预定义按键与触发按键: layout 按键定义: <Button android:id"id/start" android:layout_width"match_parent" android:layout_height"wrap_content" android:textAllC…...
AVL解析
本节主要看板书 概念 AVL树(Adelson-Velsky and Landis tree)是一种自平衡二叉查找树,用于在动态集合中进行高效的插入、删除和查找操作。它保持树的高度接近最小可能值,从而确保这些操作的时间复杂度始终保持在O(log n)。AVL树…...
用C#和WinForms打造你的专属视频播放器:从多格式支持到全屏播放的完整指南
使用 C# 和 WinForms 创建一个功能齐全的视频播放器,支持 MP4 和 AVI 格式,并具有文件夹导入、多视频播放、全屏切换、视频列表管理等功能,是一个相对复杂的项目。下面我会给出一个基本的实现方案,包括所需的关键功能和相关代码示…...
Spring security学习笔记
目录 1. 概要2. spring security原理2.1 DelegatingFilterProxy2.2 FilterChainProxy2.3 SecurityFilterChain2.4 Spring Security 作用机制 3.Spring Security快速入门4.高级自定义配置5. Spring Security 结合 JWT使用 1. 概要 Spring Security是一个用于在Java应用程序中实…...
跨境电商网站建设主管岗位职责/小红书推广引流软件
Oracle常用的连接查询方法(以oracle自带的表做的练习),left join是以左表的记录为基础的,左表中的记录会全部显示,右表只显一:Oracle常用的连接查询方法(以oracle自带的表做的练习)1、左外连接(left outer join/left join)left jo…...
ps软件下载免费/东莞seo整站优化火速
在网上看到一个不错的CSS代码:纯CSS右上角倾斜四十五度封页角效果,不需要图片什么的,就CSS控制。分享给大家!LANREN.lanren {margin: 50px auto;width: 280px;height: 180px;background: white;border-radius: 10px;-webkit-box…...
厦门做百度推广的网站/网站域名怎么查询
转载于:https://blog.51cto.com/tblduan/1899202...
咸鱼网站做链接/网上推销产品的软件
本文始发于个人公众号:TechFlow,原创不易,求个关注今天是golang专题的第6篇文章,这篇主要和大家聊聊golang当中的字符串的使用。字符串定义golang当中的字符串本质是只读的字符型数组,和C语言当中的char[]类似…...
wordpress 数据库丢失/搜索引擎营销是什么意思
当前位置:我的异常网 C# 部类“IronPython.Runtime.Binding.PythonBinder” 部类“IronPython.Runtime.Binding.PythonBinder”的派生方法“GetTypeName”不能减少访问。这什么意思啊 www.MyException.Cn 网友分享于:2014-10-26 浏览:0次 类型“IronPyt…...
如何做一张图片的网站/关键词推广是什么
fileter表案例 要求如下:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.204.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。这个需求不算复杂,但是因为有…...