最长公共子串/序列问题
时间:2022-07-23
本文章向大家介绍最长公共子串/序列问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
子串必须是连续的,子序列可以是非连续的。这两个问题属于经典的dp问题。
最长公共子串
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例:
输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出:3
解释:
长度最长的公共子数组是 [3, 2, 1] 。
提示:
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
动态规划问题最简单的做法,求啥设啥。
public int findLength(int[] A, int[] B) {
int M = A.length, N = B.length;
int ans = 0;
// dp[i][j] 表示A以i - 1结尾 B以j - 1结尾的最长公共子串的长度
int[][] dp = new int[M + 1][N + 1];
for(int i = 1; i <= M; i++){
for(int j = 1; j <= N; j++){
if(A[i - 1] == B[j - 1]){
dp[i][j] = dp[i - 1][j - 1] + 1;
ans = Math.max(ans, dp[i][j]);
}
}
}
return ans;
}
最长公共子序列
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,”ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。
若这两个字符串没有公共子序列,则返回 0。
示例 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 <= 1000
1 <= text2.length <= 1000
输入的字符串只含有小写英文字符。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
举例说明,
假设text1和text2都到了最后的位置
text1 = "abcde“,
text2 = "ace"
发现text1[4] == textt2[2],此时结果等于"abcd“和"ac”的最长子串长度 + 1.
假设text1和text2都到了最后的位置
text1 = "abcd“,
text2 = "ace"
text1[3] != text2[2] , 则选择"abc“和"ace"的公共子串与"abcd“和"ac"的公共子串中的最大的
baseline:
代码如下:
public int longestCommonSubsequence(String text1, String text2) {
int M = text1.length();
int N = text2.length();
// dp[i][j] text1以i - 1结尾 text2以j - 1结尾的最长公共子序列
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)){
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];
}
最长公共子序列的一个应用。
两个字符串的删除操作(leetcode583)
给定两个单词 word1 和 word2*,找到使得 *word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
示例:
输入: "sea", "eat"
输出: 2
解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"
我们发现最后删除之后剩下的不就是两字符串的公共子串嘛。因此可以直接用这两单词长度分别减去公共子串长度再求和即可解决。
public int minDistance(String text1, String text2) {
int M = text1.length();
int N = text2.length();
// dp[i][j] text1以i - 1结尾 text2以j - 1结尾的最长公共子序列
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)){
dp[i][j] = dp[i - 1][j - 1] + 1;
}else{
dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);
}
}
}
return M + N - 2 * dp[M][N];
}
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(22)-权限管理系统-模块导航制作
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(20)-权限管理系统-根据权限获取菜单
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(21)-权限管理系统-跑通整个系统
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(18)-权限管理系统-表数据
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(16)-权限管理系统-漂亮的验证码
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(42)-工作流设计-表建立
- 印度税务局调查比特币大户,需缴纳资本利得税;交易所Poloniex强制所有用户完成KYC
- Windows Server 2008R2配置MySQL Cluster
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(41)-组织架构
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】
- Enterprise Library深入解析与灵活应用(7):再谈PIAB与Unity之间的集成
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(39)-在线人数统计探讨
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- elasticSearch学习(六)
- centos7搭建LDAP服务器
- zookeeper is not a recognized option zookeeper参数不支持
- 快来看看你是不是“假的”DBA
- 基于docker搭建gitlab
- 理解Future及FutureTask的实现
- centos7 hbase1.4.13+hadoop2.7.1+单机环境搭建
- 关于kubeconfig多集群切换
- 代码版本管理规范
- 基于云原生系统的应用分发系统设计
- vue实现文字表情同时输入的方法
- 不同类型的ABAP内表读写性能比较
- JavaScript和ABAP的MD5计算源代码
- 读取SAP CRM One Order应用日志的优化方式
- 悟空活动中台 - 基于 WebP 的图片高性能加载方案