94、动态规划-最长公共子序列

  1. 递归的基本思路
    • 比较两个字符串的最后一个字符。如果相同,则这个字符一定属于最长公共子序列,然后在剩余的字符串上递归求解。
    • 如果最后一个字符不相同,则分两种情况递归求解:
      • 去掉 text1 的最后一个字符,保留 text2 的所有字符。
      • 去掉 text2 的最后一个字符,保留 text1 的所有字符。
    • 取两种情况的最大值作为最终结果。
  2. 递归的终止条件
    • 如果任一字符串为空,则公共子序列长度为0。

代码如下:

public class Solution {public int longestCommonSubsequence(String text1, String text2) {return lcs(text1, text2, text1.length(), text2.length());}private int lcs(String text1, String text2, int i, int j) {// 终止条件:任一字符串长度为0if (i == 0 || j == 0) {return 0;}// 递归计算if (text1.charAt(i - 1) == text2.charAt(j - 1)) {// 最后一个字符相同,是LCS的一部分return 1 + lcs(text1, text2, i - 1, j - 1);} else {// 最后一个字符不同,选择不包含text1[i-1]或text2[j-1]的最大LCSreturn Math.max(lcs(text1, text2, i - 1, j), lcs(text1, text2, i, j - 1));}}
}

动态规划是优化递归的方法,使用表格来存储中间结果,避免重复计算。

  1. 定义状态

    • dp[i][j] 表示 text1[0...i-1]text2[0...j-1] 的最长公共子序列的长度。
  2. 状态转移方程

    • 如果 text1[i-1] == text2[j-1],则 dp[i][j] = dp[i-1][j-1] + 1
    • 如果 text1[i-1] != text2[j-1],则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])
  3. 初始化

    • 初始化 dp 数组,当 ij 为0时,dp[i][j] = 0,表示一个字符串为空。
  4. 填表顺序

    • 由于每个 dp[i][j] 依赖于左边、上边和左上角的值,因此应从上到下、从左到右填表。
  5. 返回结果

    • dp[text1.length()][text2.length()] 即为两个字符串的最长公共子序列的长度。

代码如下:

public int longestCommonSubsequence(String text1, String text2) {// 获取输入字符串的长度int m = text1.length(), n = text2.length();// 创建动态规划表,多出的一行一列用于处理边界情况,即某一字符串长度为0的情况int[][] dp = new int[m + 1][n + 1];// 填充动态规划表for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {// 检查当前位置的字符是否相同if (text1.charAt(i - 1) == text2.charAt(j - 1)) {// 如果当前两个字符相同,那么这两个字符属于LCS的一部分// 因此dp[i][j]等于左上角的值加1dp[i][j] = dp[i - 1][j - 1] + 1;} else {// 如果当前两个字符不相同,则LCS长度取决于不包含当前字符的子问题的最大值// 即从左边或上边继承最大值dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}// 返回最终结果,即整个字符串的最长公共子序列长度return dp[m][n];}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/12680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文笔记 | 异步联邦】FedSA

FedSA&#xff1a;一种处理 non-IID 数据 的 过时感知 异步联邦算法 1. 论文信息 FedSA&#xff1a;A staleness-aware asynchronous Federated Learning algorithm with non-IID data&#xff0c;Future Generation Computer Systems&#xff0c;2021.7&#xff0c;ccfc 是…

RHEL之网络接口的绑定

前言 这些步骤最好都在虚拟机中完成 网络接口绑定是将多个网络接口逻辑地连接在一起&#xff0c;目的一是避免网络接口的单点故障&#xff0c;二是提高带宽以提高吞吐率 具体步骤 1.用ip link查看有哪些网络接口 2.添加一个类型bond的连接 nmcli con add type bond con-nam…

【汇编】算术指令

一、加法指令 &#xff08;一&#xff09;各加法指令的格式及操作 加法指令可做字或字节运算 &#xff08;1&#xff09;加法指令 ADD 格式&#xff1a;ADD DST,SRC执行的操作&#xff1a;(DST) ← (SRC)(DST) &#xff08;2&#xff09;带进位加法指令 ADC 格式&#xf…

AIGC岗位需求增长超300%,平均年薪超40万元

AI圈最近又发生了啥&#xff1f; AIGC 应用爆发&#xff0c;相关岗位需求增长超 300%、平均招聘年薪超 40 万元 随着 AI应用的爆发&#xff0c;生成式人工智能(AIGC)的招聘市场十分火爆。数据显示今年一季度&#xff0c;生成式人工智能相关职位需求同比增长超三倍。从全平台增…

Scala编程基础6:连接mysql数据库、在scala中使用fastJson

一、scala连接mysql数据库 /*** scala连接mysql数据库*/ object JDBCDEmo8 {def main(args: Array[String]): Unit {//加载驱动Class.forName("com.mysql.jdbc.Driver")//创建与数据库连接对象val conn: Connection DriverManager.getConnection("jdbc:mysql…

功能安全如何在公司顺利开展?-亚远景科技

亚远景功能安全主题线上会议报名开启&#xff01; 随着汽车技术的不断发展&#xff0c;汽车系统的复杂性和交互性大幅增加&#xff0c;功能安全成为确保驾驶员、乘客及行人安全的关键。 本场功能安全线上会议&#xff0c;亚远景为汽车行业的相关人员准备了以下内容&#xff1a…

Linux|基础IO

Linux|基础IO 回顾c语言的文件操作提炼对文件的理解系统调用初始open函数返回值fd为什么我们向fd一个整数写就写入文件了呢&#xff1f;怎么理解读写操作总结open函数有哪些功能怎么理解往硬件&#xff08;显示器&#xff0c;键盘&#xff09;中读写数据如何理解FILE*访问文件 …

【C语言】自定义类型之---结构体超详解(结构体的定义使用、指针结构体,内存对齐,......代码详解)

目录 前言&#xff1a; 一&#xff1a;结构体 1.1&#xff1a;什么是结构体&#xff1f; 1.2&#xff1a;结构体类型的声明 1.3&#xff1a;结构体变量的定义 1.4&#xff1a;结构体的内存对齐 1.5&#xff1a;结构体传参 二&#xff1a;位段 2.1&#xff1a;位段是什…

2024年【金属非金属矿山(露天矿山)安全管理人员】模拟考试题库及金属非金属矿山(露天矿山)安全管理人员作业模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员模拟考试题库参考答案及金属非金属矿山&#xff08;露天矿山&#xff09;安全管理人员考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山&a…

Google I/O 2024 干货全解读:Gemini AI 横空出世,智能未来触手可及!

Google I/O 2024 干货全解读&#xff1a;Gemini AI 横空出世&#xff0c;智能未来触手可及&#xff01; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》…

面试前端随笔20240510

最近公司招聘前端开发人员有幸参与帮听&#xff0c;总结了三个有关vue的面试问题和答案&#xff0c;现在分享一下。 1.Vue2数据监听无法监听数组为啥&#xff1f;有啥解决方案&#xff1f;vue3中是如何处理这个问题&#xff1f; vue2的官方说明了defineProperty的一些限制&…

Oracle SQL Developer 脚本输出中文显示乱码

问题描述 在测试Oracle Select AI&#xff08;自然语言查询数据库&#xff09;时&#xff0c;发现Run Statement中文显示正常&#xff1a; 而Run Script中文显示乱码&#xff1a; 问题解决 进入菜单Tools>Preferences...>Environment&#xff0c; 修改SQL Developer…

JavaScript-JSON对象

JSON格式 JSON&#xff08;JavaScript Object Notation, JS对象简谱&#xff09;是一种轻量级的数据交换格式。它基于ECMAScript&#xff08;European Computer Manufacturers Association, 欧洲计算机协会的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示…

spring基于XML的声明式事务控制

在Spring框架中&#xff0c;基于XML的声明式事务控制是一种通过配置来管理事务的方式&#xff0c;而无需在代码中显式编写事务逻辑。以下是如何在Spring中使用XML来配置声明式事务控制的步骤&#xff1a; 添加必要的依赖 确保你的项目中包含了Spring框架的核心包和Spring事务…

赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十八)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 100道 Java 基础面试题&#xff08;四十七&#xff09;-CSDN博客 九十五、spring支持几种bean的作用域&#xff1f; Spring框架支持多种Bean的作用域&#xff0c;每种作用域都定义了Spring容器如何管理和创建Bean的…

论文:论面向服务的架构设计

题目 在面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;SOA&#xff09;中&#xff0c;服务的概念有了延伸&#xff0c;泛指系 统对外提供的功能集。例如&#xff0c;在一个大型企业内部&#xff0c;可能存在进销存、人事档案和财务等多个系统&#xff…

Java程序运行流程

Java运行流程 Java源代码 — 编译工具 —> Java字节码文件 — 运行工具 —> Java程序运行 Java程序的基本单位 类 Java程序执行入口 main方法

盘点那些年我们一起玩过的网络安全工具

一、反恶意代码软件 1.Malwarebytes 这是一个检测和删除恶意的软件&#xff0c;包括蠕虫&#xff0c;木马&#xff0c;后门&#xff0c;流氓&#xff0c;拨号器&#xff0c;间谍软件等等。快如闪电的扫描速度&#xff0c;具有隔离功能&#xff0c;并让您方便的恢复。包含额外…

项目中使用Elasticsearch的API相关介绍

项目中使用Elasticsearch的API相关介绍 0、域映射类型 text&#xff1a;会分词&#xff0c;不支持聚合对当前搜索关键词&#xff0c;先自身分词&#xff0c;分成多个词&#xff0c;然后去一个一个的词去利用倒排索引去查询es索引库一般应用在搜索关键字匹配的字段的类型。 商…

上海市计算机学会竞赛平台2020年8月月赛丙组促销骰子

题目描述 小爱的商店正在促销。顾客在付款的时候&#xff0c;有机会掷一次骰子&#xff0c;如果掷出 66&#xff0c;可以获得优惠&#xff0c;并且可以继续掷骰子&#xff0c;直到出现不是 66 的情况&#xff0c;或掷三次为止。获奖规则如下&#xff1a; 如果没有 66&#xf…