【算法】动态规划—最长公共子序列

        最长公共子序列问题就是求出两个字符串的LCS长度,是一道非常经典的面试题目,因为它的解法是典型的二维动态规划。

        比如输入 str1 = "babcde", str2 = "acbe",算法应该输出3,因为 str1 和 str2 的最长公共子序列是 "ace",它的长度是3。

        子序列类型的问题,穷举出所有可能的结果都不容易,而动态规划算法做的就是穷尽+剪枝,它俩天生一对。所以可以说只要涉及子序列问题,十有八九需要动态规划来解决,往这方面考虑就对了。

动态规划思路

第一步,一定要明确dp数组的含义

        对于两个字符串的动态规划问题,套路都是通用的,一般都需要一个二维dp数组。比如对于字符串 str1 和 str2,一般来说要构造一个这样的 DP table:

        其中,dp[i][j]的含义是:对于 str1[0...i-1] 和 str2[0...j-1],它们的LCS长度是 dp[i][j]。

        上图这个例子,dp[2][4] = 2 的含义就是:对于 "ac" 和 "babc",它们的LCS长度是2。根据这个定义,最终想得到的答案应该是 dp[3][6]。

第二步,定义base case

        专门让索引为0的行和列表示空串,dp[0][..],dp[..][0]都应该初始化为0,这就是 base case。比如按照刚才dp数组的定义,dp[0][3]=0 的含义是:对于空字符串 "" 和 "bab",其LCS的长度为0。因为一个字符串是空串,它们的最长公共子序列的长度显然应该是0。

第三步,找状态转移方程

        很简单,做两种选择,要么在lcs中,要么不在。

        如果 str1[i] == str2[j],说明这个公共字符一定在lcs中。

        if str[i] == str[j]:

                dp(i, j) = dp(i-1, j-1) + 1

        如果 str1[i] != str2[j],说明 str[i] 和 str[j] 至少有一个不在lcs中,那么到底哪个字符不在lcs中?都试一下呗:

        if str1[i] != str2[j]:

                dp(i, j) = max(dp(i-1, j), dp(i, j-1))

第四步,直接写暴力解法

        首先写一个递归解法:

package DynamicProgramming;
// leetcode 095 最长公共子序列// 暴力解法 (提交超出时间限制)
public class LCS {private String text1;private String text2;public int longestCommonSubsequence(String text1, String text2) {this.text1 = text1;this.text2 = text2;// 计算str1[0...i-1]和str2[0...j-1]中的lcs长度return dp(text1.length() - 1, text2.length() - 1);}public int dp(int i, int j) {// 递归终止条件// 空串的 base caseif (i == -1 || j == -1) {return 0;}// 递归操作// 状态转移方程if (text1.charAt(i) == text2.charAt(j)) {// 这边找到一个lcs中的元素return dp(i - 1, j - 1) + 1;} else {// 至少有一个字符不在lcs中// 都试一下,谁能让lcs最长,就听谁的return Math.max(dp(i - 1, j), dp(i, j - 1));}}public static void main(String[] args) {LCS lcs = new LCS();int len = lcs.longestCommonSubsequence("babcde", "acbe");System.out.println(len);}}

第五步,引入 DP table 来优化时间复杂度

// 引入dp table
public class LCS {public int longestCommonSubsequence(String text1, String text2) {// 1.定义dp tableint m = text1.length();int n = text2.length();// 要算上表示空串的行列int[][] dp = new int[m + 1][n + 1];// 2.base case int型的数组默认值都是零,所以这一步可以没有// 3.状态转移方程for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {// 状态转移逻辑if (text1.charAt(i - 1) == text2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);}}}return dp[m][n];}public static void main(String[] args) {LCS lcs = new LCS();int len = lcs.longestCommonSubsequence("babcde", "acbe");System.out.println(len);}}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

视频格式转为mp4(使用ffmpeg)

1、首先安装ffmpeg&#xff0c;下载链接如下 https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-6.1.1-full_build.7z 安装后确保ffmpeg程序加到PATH路径里&#xff0c;cmd执行ffmpeg -version出现下图内容表示安装成功。 2、粘贴下面的脚本到文本文件中&#xff0c;文件后缀…

基于对数变换的图像美白增强,Matlab实现

博主简介&#xff1a;matlab图像处理&#xff08;QQ:3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于对数变换的图像美白增强&#xff0c;用matlab实现。 一、案例背景和算法介绍 这次案例是美白算法&…

re题(20)BUUCTF [GWCTF 2019]pyre

BUUCTF在线评测 (buuoj.cn) Python解包及反编译: PyInstaller Extractoruncompyle6 - 知乎 (zhihu.com) python撤消&#xff1a; Pycharm撤销操作和代码跳转后退回操作以及消除波浪线操作快捷键_pycharm怎么反撤销-CSDN博客 把.pyc文件变成py文件 把.py文件用记事本打开 cod…

每日OJ_牛客_BC64 牛牛的快递

目录 牛客_BC64 牛牛的快递&#xff08;简单模拟&#xff09; 解析代码1 解析代码2 牛客_BC64 牛牛的快递&#xff08;简单模拟&#xff09; 牛牛的快递_牛客题霸_牛客网 描述 牛牛正在寄快递&#xff0c;他了解到快递在 1kg 以内的按起步价 20 元计算&#xff0c;超出部…

Qt ORM模块使用说明

附源码&#xff1a;QxOrm是一个C库资源-CSDN文库 使用说明 把QyOrm文件夹拷贝到自己的工程项目下, 在自己项目里的Pro文件里添加include($$PWD/QyOrm/QyOrm.pri)就能使用了 示例test_qyorm.h写了表的定义,Test_QyOrm_Main.cpp中写了所有支持的功能的例子: 通过自动表单添加…

【代码随想录Day14】二叉树Part02

226.翻转二叉树 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 遍历二叉树&#xff0c;交换每个节点的左右子树。 class Solution {public TreeNode invertTree(TreeNode root) {preorder(root);return root;}public static void preorder(TreeNode root) {if (root nu…

基于微信小程序的学生公寓电费信息管理系统+ssm(lw+演示+源码+运行)

基于微信小程序的学生公寓电费信息管理系统 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;微信小程序被…

服务器上PFC配置丢失问题排查与解决方案

现象 基于nccl的多轨通信算力中心出现交换机端口出入方向丢包 分析 机间通信使用RoCE网络&#xff0c;为了避免因丢包导致大量重传报文影响训练性能&#xff0c;我们基于PFC和ECN在交换机和服务器配置搭建了无损网络&#xff0c;理论上是不允许丢包的&#xff0c;现在出现交…

TryHackMe 第1天 | Introduction to Cyber Security

偶然之间了解到了TryHackMe这个网站&#xff0c;尝试跟着其中的学习路径进行学习&#xff0c;发现还是挺适合入门网络安全这一领域的。但是这个网站包含了很多内容&#xff0c;如果不用一些东西记录下来&#xff0c;那么很容易忘记&#xff0c;所以打算在此记录一下学习过程。 …

JUC学习笔记(三)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 八、共享模型之工具--JUC8.1 AQS 原理1. 概述2 实现不可重入锁自定义同步器自定义锁 3.心得起源目标设计1) state 设计2&#xff09;阻塞恢复设计3&#xff09;队列…

linux 操作系统下date 命令介绍和使用案例

linux 操作系统下date 命令介绍和使用案例 在 Linux 操作系统中&#xff0c;date 命令是一个用于显示和设置系统日期和时间的基本工具。它不仅可以显示当前的日期和时间&#xff0c;还允许用户以不同的格式输出日期&#xff0c;并进行日期计算 1. date 命令简介 date 命令用…

神经网络_使用tensorflow对fashion mnist衣服数据集分类

from tensorflow import keras import matplotlib.pyplot as plt1.数据预处理 1.1 下载数据集 fashion_mnist keras.datasets.fashion_mnist #下载 fashion mnist数据集 (train_images, train_labels),(test_images, test_labels) fashion_mnist.load_data()print("t…

C++广义表的介绍及创建方法-附C语言实现代码

1. 简介 数组可以存储不允许再分割的数据元素&#xff0c;如字符’X’&#xff0c;数字11&#xff0c;当然它也可以存储数组&#xff0c;二维数组就是一个例子&#xff0c;你可以理解二维数组的每一行的元素是一列中的对应元素的组合。 广义表是一种线性表&#xff0c;或者说…

JVM HotSpot 虚拟机: 对象的创建, 内存布局和访问定位

目录 前言 对象的创建 对象的内存布局 对象的访问定位 前言 了解JVM的内存区域划分之后, 也大致了解了java程序的内存分布模型, 也了解它里面的内存区域里面的类型和各个类型的作用, 接下来我们进一步从对象创建到访问的角度, 来看看这些内存区域之间是怎么关联起来的. …

2023高教社杯全国大学生数学建模竞赛C题 Python代码演示

目录 问题一1.1 蔬菜类商品不同品类或不同单品之间可能存在一定的关联关系&#xff0c;请分析蔬菜各品类及单品销售量的分布规律及相互关系。数据预处理数据合并提取年、月、日信息对蔬菜的各品类按月求销量均值 季节性时间序列分解STL分解加法分解乘法分解 ARIMALSTM import p…

什么是代理IP_如何建立代理IP池?

什么是代理IP_如何建立代理IP池&#xff1f; 1. 概述1.1 什么是代理IP&#xff1f;1.2 代理IP的工作原理1.3 爬虫的应用场景1.3.1 搜索引擎&#xff0c;最大的爬虫1.3.2 数据采集&#xff0c;市场分析利器1.3.3 舆情监控&#xff0c;品牌营销手段1.3.4 价格监测&#xff0c;全网…

时序差分法

一、时序差分法 时序差分是一种用来估计一个策略的价值函数的方法&#xff0c;它结合了蒙特卡洛和动态规划算法的思想。时序差分方法和蒙特卡洛的相似之处在于可以从样本数据中学习&#xff0c;不需要事先知道环境&#xff1b;和动态 规划的相似之处在于根据贝尔曼方程的思想&…

外网(公网)访问VMware workstation 虚拟机内web网站的配置方法---端口转发总是不成功的原因

问题背景&#xff1a;客户提供的服务器操作系统配置web程序时&#xff0c;总是显示莫名其妙的问题&#xff0c;发现是高版本操作系统的.net库已经对低版本.net库进行了大范围修订&#xff0c;导致在安全检测上、软件代码规范上更加苛刻&#xff0c;最终导致部署不成功。于是想到…

【C++】入门基础(下)

Hi&#xff01;很高兴见到你~ 目录 7、引用 7.3 引用的使用&#xff08;实例&#xff09; 7.4 const引用 【第一分点】 【第二分点1】 【第二分点2】 7.5 指针和引用的关系&#xff08;面试点&#xff09; 8、inline 9、nullptr Relaxing Time&#xff01; ———…