Java最长公共子序列知识点(含面试大厂题和源码)

最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中的一个经典问题,主要涉及两个序列,并寻找这两个序列中最长的共有子序列。这个子序列不需要在原序列中连续,但必须保持元素的相对顺序。LCS问题在多种领域都有应用,如生物信息学中的DNA序列比对、版本控制系统中的文件差异检测等。

解决LCS问题的一个常见方法是使用动态规划。基本思路是创建一个二维数组,其中dp[i][j]表示字符串1的前i个字符和字符串2的前j个字符的最长公共子序列的长度。状态转移方程如下:

  • 如果字符串1的第i个字符等于字符串2的第j个字符,则dp[i][j] = dp[i-1][j-1] + 1
  • 否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])

除了动态规划外,还可以使用分治法和回溯法来解决LCS问题,但动态规划由于其高效性和简洁性而被广泛采用。LCS问题的时间复杂度通常是O(nm),其中n和m分别是两个序列的长度。

在实际应用中,除了求最长公共子序列的长度,有时还需要输出具体的子序列。这可以通过在动态规划的基础上增加额外的记录步骤来实现,即记录每个dp[i][j]是由哪个状态转移得来的,然后根据这些信息回溯出最长公共子序列。

LCS问题在算法面试中非常常见,是检验候选人对动态规划理解和应用能力的重要题目之一。最长公共子序列(LCS)问题是算法面试中的常见题目,尤其是在大厂的面试中。以下是三道与LCS相关的面试题目,以及相应的Java源码实现。

题目 1:求两个字符串的最长公共子序列长度

描述
给定两个字符串,求它们的最长公共子序列的长度。

示例

输入: str1 = "ABCD", str2 = "ACDF"
输出: 3

Java 源码

public class LongestCommonSubsequenceLength {public int lcsLength(String str1, String str2) {int m = str1.length();int n = str2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (str1.charAt(i - 1) == str2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[m][n];}public static void main(String[] args) {LongestCommonSubsequenceLength solution = new LongestCommonSubsequenceLength();String str1 = "ABCD";String str2 = "ACDF";int result = solution.lcsLength(str1, str2);System.out.println("Length of LCS: " + result);}
}

题目 2:求两个字符串的最长公共子序列

描述
给定两个字符串,求它们的最长公共子序列。

示例

输入: str1 = "ABCD", str2 = "ACDF"
输出: "ACD"

Java 源码

public class LongestCommonSubsequence {public String lcs(String str1, String str2) {char[][] dp = new char[str1.length() + 1][str2.length() + 1];buildLCSMatrix(str1, str2, dp);return constructLCS(dp);}private void buildLCSMatrix(String str1, String str2, char[][] dp) {for (int i = 0; i <= str1.length(); i++) {for (int j = 0; j <= str2.length(); j++) {if (i == 0 || j == 0) {dp[i][j] = 0;} else if (str1.charAt(i - 1) == str2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}}private String constructLCS(char[][] dp) {int i = dp.length - 1;int j = dp[0].length - 1;StringBuilder lcs = new StringBuilder();while (i > 0 && j > 0) {if (dp[i][j] == dp[i - 1][j - 1] + 1) {lcs.insert(0, dp[i - 1][j - 1] + " ");i--;j--;} else if (dp[i][j] == dp[i - 1][j]) {i--;} else {j--;}}return lcs.toString();}public static void main(String[] args) {LongestCommonSubsequence solution = new LongestCommonSubsequence();String str1 = "ABCD";String str2 = "ACDF";String result = solution.lcs(str1, str2);System.out.println("LCS: " + result);}
}

题目 3:求多个字符串的最长公共子序列

描述
给定多个字符串,求它们的最长公共子序列。

示例

输入: strings = ["ABCD", "ACDF", "ABCF"]
输出: "ACD"

Java 源码

import java.util.List;public class LongestCommonSubsequenceMultiple {public String lcsMultiple(List<String> strings) {if (strings == null || strings.isEmpty()) {return "";}String lcs = strings.get(0);for (int i = 1; i < strings.size(); i++) {lcs = lcs(lcs, strings.get(i));}return lcs;}private String lcs(String str1, String str2) {char[][] dp = new char[str1.length() + 1][str2.length() + 1];buildLCSMatrix(str1, str2, dp);return constructLCS(dp);}private void buildLCSMatrix(String str1, String str2, char[][] dp) {for (int i = 0; i <= str1.length(); i++) {for (int j = 0; j <= str2.length(); j++) {if (i == 0 || j == 0) {dp[i][j] = 0;} else if (str1.charAt(i - 1) == str2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}}private String constructLCS(char[][] dp) {int i = dp.length - 1;int j = dp[0].length - 1;StringBuilder lcs = new StringBuilder();while (i > 0 && j > 0) {if (dp[i][j] == dp[i - 1][j - 1] + 1) {lcs.insert(0, dp[i - 1][j - 1] + " ");i--;j--;} else if (dp[i][j] == dp[i - 1][j]) {i--;} else {j--;}}return lcs.toString();}public static void main(String[] args) {LongestCommonSubsequenceMultiple solution = new LongestCommonSubsequenceMultiple();List<String> strings = List.of("ABCD", "ACDF", "ABCF");String result = solution.lcsMultiple(strings);System.out.println("LCS: " + result);}
}

这些题目和源码展示了LCS问题的不同变体以及如何在实际编程中解决它们。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

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

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

相关文章

Centos7在线安装mysql5.7

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装Mysql yum源1、卸载旧环境2、下载mysql yum源3、上传到自己服务器1&#xff09;、上传源2&#xff09;、安装yum源3&#xff09;、查看yum源是否安装成功 安装M…

信息系统项目管理师——管理类计算

风险管理——风险曝光度 风险曝光度概率*影响&#xff0c;概率指风险发生的概率&#xff0c;影响指风险一旦发生&#xff0c;受到影响的项。 题号【GX20061101](61) 知识点[风险曝光度] 风险的成本估算完成后&#xff0c;可以针对风险表中每个风险计算其风险曝光度。某软件小…

面试官:MySQL的自增 ID 用完了,怎么办?

如果你用过或了解过MySQL&#xff0c;那你一定知道自增主键了。每个自增id都是定义了初始值&#xff0c;然后按照指定步长增长&#xff08;默认步长是1&#xff09;。虽然&#xff0c;自然数是没有上限的&#xff0c;但是我们在设计表结构的时候&#xff0c;通常都会指定字段长…

0.25W 3KVDC 隔离单、双输出 DC/DC SMD 型电源模块 ——TPVT-W2 系列

TPVT-W2系列是一款标准的表面贴装电源模块&#xff0c;完全实现采用全自动贴片机来组装和满足回流焊工艺&#xff0c;大大提高产能和降低人工费用。此系列产品小&#xff0c;效率高&#xff0c;低输出纹波及提供3000V以上的直流电压隔离&#xff0c;SMD封装。

在vue中使用bing map 的小demo

1.注意事项&#xff08;关于经纬度&#xff09; 如果不转换成WGS84 标准的经纬度 bing map会报错 如果要在 Bing Maps 中使用中国地区的经纬度&#xff0c;需要先将其转换为 WGS84 标准的经纬度。你可以使用第三方的坐标转换服务&#xff0c;或者使用相关的 JavaScript 库进行…

从数据中台到上层应用全景架构示例

一、前言 对于大型企业而言&#xff0c;数据已经成为基本的生产资料&#xff0c;但是有很多公司还是值关心上层应用&#xff0c;而忽略了数据的治理&#xff0c;从而并不能很好的发挥公司的数据资产效益。比如博主自己是做后端的&#xff0c;主要是做应用层&#xff0c;也就是…

计算机网络 Cisco路由信息协议(RIP)实验

一、实验内容 1、命名 2、关闭域名解释 3、设置路由器接口IP地址 4、根据要求配置RIP以实现所有客户机都能相互通信 5、配置默认路由 二、实验数据处理 1、建立拓扑图 2、PC机地址配置 主机IP地址子网掩码网关PC110.23.1.2255.255.255.010.23.1.1PC210.23.1.3255.255.2…

将普通用户加入Docker组,使用docker

创建名为 “docker” 的组 要创建名为 “docker” 的组&#xff0c;您可以使用以下命令&#xff1a; sudo groupadd docker这将创建一个名为 “docker” 的组。您可以使用此组来管理 Docker 容器的访问权限。 查看 Docker 组中的用户 要查看 Docker 组中的用户&#xff0c;…

OR36 链表的回文结构

描述 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构。 给定一个链表的头指针A&#xff0c;请返回一个bool值&#xff0c;代表其是否为回文结构。保证链表长度小于等于900。 测试样例&#xff1a; 1->…

ChatGPT革新论文写作:让文章无往不利

ChatGPT无限次数:点击直达 ChatGPT革新论文写作&#xff1a;让文章无往不利 在当今信息爆炸的时代&#xff0c;写作是一项至关重要的技能&#xff0c;它不仅仅是传递信息的工具&#xff0c;更是展示思想、沟通观点的重要方式。而随着人工智能技术的不断发展&#xff0c;ChatGP…

代码随想录算法练习Day13:有效的字母异位词

题目&#xff1a; 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 题目链接&#xff1a;242.有效的字母异位词 卡哥的视频讲解&#xff…

SCM供应链一体化平台:增强企业竞争力的必备利器

SCM供应链一体化平台是一种集成的软件系统&#xff0c;用于管理和优化企业的供应链活动。它将供应链中的各个环节&#xff0c;如采购、生产、物流、销售等&#xff0c;整合在一个统一的平台上&#xff0c;实现信息共享、协同工作和流程优化。 SCM供应链一体化平台的主要功能包括…

Linux/Iclean

Iclean Enumeration nmap 先使用默认规则扫描常用的端口&#xff0c;发现对外开放了 22 和 80 端口&#xff0c;然后扫描这两个端口的详细信息&#xff0c;结果如下&#xff0c;很常规的结果&#xff0c;没发现什么有趣的东西 ┌──(kali㉿kali)-[~/vegetable/HTB/Iclean] …

Appium 并发测试之 python 启动 appium 服务

python 启动appium服务&#xff0c;需要使用subprocess模块&#xff0c;该模块可以创建新的进程&#xff0c;并且连接到进程的输入&#xff0c;输出&#xff0c;错误等管道信息&#xff0c;并且可以获取进程的返回值 测试场景 使用python启动2台appium服务&#xff0c;端口配置…

面试经典150题——轮转数组

面试经典150题 day6 题目来源我的题解方法一 使用额外数组方法二 循环替换方法三 数组翻转 题目来源 力扣每日一题&#xff1b;题序&#xff1a;189 我的题解 方法一 使用额外数组 使用一个额外数组暂存最终答案&#xff0c;最后再赋值给nums 时间复杂度&#xff1a;O(n) 空…

永久关闭 Windows 11 系统更新

永久关闭 Windows 11 系统更新 请注意&#xff0c;关闭系统更新可能会使您的系统面临安全风险。确保您了解可能的后果&#xff0c;并在必要时考虑重新启用更新。 使用组策略编辑器&#xff08;仅限 Windows 11 Pro 和 Enterprise 版&#xff09; 步骤 1&#xff1a;打开本地…

Unsupervised Learning ~ Anomaly detection

unusual events vibration: 振动 Density estimation: Gaussian(normal) Distribution. standard deviation: 标准差 variance deviation sigma Mu Parameter estimation Anomaly detection algorithm 少量异常样本点的处理经验 algorithm evaluation skewed datatsets:…

【第十五届】蓝桥杯省赛C++b组

今年的蓝桥杯省赛已经结束了&#xff0c;与以往不同&#xff0c;今年又回到了8道题&#xff0c;而22&#xff0c;23年出现了10道题 大家觉得难度怎么样&#xff0c;欢迎进来讨论&#xff0c;博主今年没参加哈&#xff0c;大家聊聊&#xff0c;我听听大家的意见和看法哈 试题A:…

HTML制作跳动的心形网页

作为一名码农 也有自己浪漫的小心思嗷~ 该网页 代码整体难度不大 操作性较强 祝大家都幸福hhhhh 效果成品&#xff1a; 全部代码&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE> 一个…

静电对集成电路封装的危害及防范措施

在现代工业生产中&#xff0c;静电已经成为一个不可忽视的问题。特别是在集成电路&#xff08;IC&#xff09;封装领域&#xff0c;静电可能对产品质量和生产效率造成严重的影响。本文将探讨静电对IC封装的危害&#xff0c;并介绍一些防范措施以减少静电带来的风险。 静电对IC封…