每日一题 1143最长公共子序列(LCS)(灵神版本)

2023-10-09 05:15

本文主要是介绍每日一题 1143最长公共子序列(LCS)(灵神版本),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

题目
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:

输入:text1 = “abcde”, text2 = “ace”
输出:3
解释:最长公共子序列是 “ace” ,它的长度为 3 。
示例 2:

输入:text1 = “abc”, text2 = “abc”
输出:3
解释:最长公共子序列是 “abc” ,它的长度为 3 。
示例 3:

输入:text1 = “abc”, text2 = “def”
输出:0
解释:两个字符串没有公共子序列,返回 0 。

题解

回溯三问

  1. 当前操作:考虑s[i]和t[j]选或不选
  2. 子问题:前i个和前j个的LCS
  3. 下一个子问题:前i-1个和前j-1个;前i个和前j-1个;前i-1个和前j个

可以得到:
s[i] = t[j]时,dfs(i,j)=max(dfs(i,j-1),dfs(i-1,j),dfs(i-1,j-1)+1)
不满足s[i] = t[j]时,dfs(i,j)=max(dfs(i,j-1),dfs(i-1,j),dfs(i-1,j-1))

两个问题:
s[i] = t[j]时,需要dfs(i,j-1),dfs(i-1,j)吗? 答案是否定的
举个例子:
s=abcdc,t=abc,此时c都选,相当于s=abcd,t=ab的LCS(x)+1,此时dfs(i-1,j-1),
如果s=abcd,t=abc更优dfs(i,j-1),那么此时dfs(i,j-1)>x+1,
接下来s=abd,t=ab的LCS大于x,又因为此时的s,t为s=abcd,t=ab的子序列,所以s=abd,t=ab的LCS一定小于等于x,所以相互矛盾
不满足s[i] = t[j]时,需要dfs(i-1,j-1)吗 同样也是不需要的
dfs(i-1,j-1)的答案是包含在dfs(i,j-1)之中的,即dfs(i,j-1)>=dfs(i-1,j-1)

记忆化搜索

class Solution {private char[] s,t;private int[][] cache;public int longestCommonSubsequence(String text1, String text2) {s = text1.toCharArray();t = text2.toCharArray();int n = s.length;int m = t.length;cache = new int[n][m];for (int i = 0; i < n; i++) {Arrays.fill(cache[i],-1);}return dfs(n - 1, m - 1);}public int dfs(int i, int j) {if (i < 0 || j < 0) {return 0;}if (cache[i][j] != -1) {return cache[i][j];}if (s[i] == t[j]) {return cache[i][j] = dfs(i - 1,j - 1) + 1;}return cache[i][j] = Math.max(dfs(i - 1, j),dfs(i, j - 1));}
}

递推

class Solution {public int longestCommonSubsequence(String text1, String text2) {char[] s = text1.toCharArray();char[] t = text2.toCharArray();int n = s.length;int m = t.length;int[][] f = new int[n + 1][m + 1];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {f[i + 1][j + 1] = s[i] == t[j] ? f[i][j] + 1 :Math.max(f[i + 1][j], f[i][j + 1]);}}return f[n][m];}
}

空间优化

class Solution {public int longestCommonSubsequence(String text1, String text2) {char[] t = text2.toCharArray();int m = t.length;int[] f = new int[m + 1];for (char x : text1.toCharArray()) {for (int j = 0, pre = 0; j < m; j++) {int temp = f[j + 1];f[j + 1] = x == t[j] ? pre + 1 : Math.max(f[j + 1], f[j]);pre = temp;}}return f[m];}
}

这篇关于每日一题 1143最长公共子序列(LCS)(灵神版本)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/170596

相关文章

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

《JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)》本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有... 目录第一步 下载安装JDK第二步 配置环境变量第三步 切换JDK版本并验证可能遇到的问题前提:公司常

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Mybatis从3.4.0版本到3.5.7版本的迭代方法实现

《Mybatis从3.4.0版本到3.5.7版本的迭代方法实现》本文主要介绍了Mybatis从3.4.0版本到3.5.7版本的迭代方法实现,包括主要的功能增强、不兼容的更改和修复的错误,具有一定的参考... 目录一、3.4.01、主要的功能增强2、selectCursor example3、不兼容的更改二、

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3