热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode1143.最长公共子序列【c++/java详细题解】

1、题目给定两个字符串text1和text2,返回这两个字符串的最长公共子序列

1、题目

给定两个字符串 text1text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 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 <= text1.length, text2.length <= 1000
  • text1text2 仅由小写英文字符组成。

2、思路

**(动态规划)**O ( n m ) O(nm)O(nm)

给定两个字符串 text1text2,返回这两个字符串的最长 公共子序列 的长度 (子序列可以不连续)。

样例:

如样例所示,字符串abcde与字符串ace的最长公共子序列为ace,长度为3。最长公共子序列问题是典型的二维动态规划问题,下面来讲解动态规划的做法。

状态表示: 定义 f[i][j]表示字符串text1[1,i]区间和字符串text2[1,j]区间的最长公共子序列长度(下标从1开始)。

状态计算:

可以根据text1[i]text2[j]的情况,分为两种决策:

  • 1、若text1[i] == text2[j] ,也就是说两个字符串的最后一位相等,那么问题就转化成了字符串text1[1,j-1]区间和字符串text2[1,j-1]区间的最长公共子序列长度再加上一,即f[i][j] = f[i - 1][j - 1] + 1。(下标从1开始)

  • 2、若text1[i] != text2[j],也就是说两个字符串的最后一位不相等,那么字符串text1[1,i]区间和字符串text2[1,j]区间的最长公共子序列长度无法延长,因此f[i][j]就会继承f[i-1][j]f[i][j-1]中的较大值,即f[i][j] = max(f[i - 1][j],f[i][j - 1]) 。 ( 下标从1开始)

  • 如上图所示:我们比较text1[3]text2[3],发现'f'不等于'e',这样f[3][3]无法在原先的基础上延长,因此继承"ac""cfe""acf""cf"的最长公共子序列中的较大值,即 f[3][3] = max(f[2][3] ,f[3][2]) = 2

因此,状态转移方程为:

f[i][j] = f[i-1][j-1] + 1 ,当text1[i] == text2[j]

f[i][j] = max(f[i - 1][j],f[i][j - 1]),当text1[i] != text2[j]​

初始化:

f[i][0] = f[0][j] = 0,(0 <=i<=n, 0<=j<=m)

空字符串与有长度的字符串的最长公共子序列长度肯定为0

实现细节:

我们定义的状态表示f数组和text数组下标均是从1开始的,而题目给出的text数组下标是从0开始的,为了一 一对应,在判断text1text2数组的最后一位是否相等时,往前错一位,即使用text1[i - 1]text2[j - 1]来判断。

**时间复杂度分析:**O ( n m ) O(nm)O(nm),其中n nn 和 m mm 分别是字符串 text1text2的长度。

3、c++代码

class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int n = text1.size(), m = text2.size();
vector> f(n + 1, vector(m + 1, 0));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (text1[i - 1] == text2[j - 1]) {
f[i][j] = f[i - 1][j - 1] + 1;
} else {
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
}
}
}
return f[n][m];
}
};

4、java代码

class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int n = text1.length(), m = text2.length();
int[][] f = new int[n + 1][m + 1];
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
f[i][j] = f[i - 1][j - 1] + 1;
} else {
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]);
}
}
}
return f[n][m];
}
}

原题链接:1143. 最长公共子序列


推荐阅读
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
author-avatar
jason2502893743
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有