动态规划问题(六)最长公共子序列(LCS)
问题描述
给你两个字符串,要求得到这两个字符串的最长公共子序列长度。
比如:对于输入的字符串 S1 "AGGTAB" 和 S2 "GXTXAYB",它们的最长公共子序列长度为 4,为 {'G', 'T', 'A', 'B'}
解决思路
该问题刚开始见到时没有思路,但是把问题细分一下找到规律即可解决。
递归
对于当前输入的两个字符串,可以通过不断将两个字符串的分别移除来减小问题的规模,最终收敛
以上文的输入为例,对于输入的 S1 “AGGTAB” 和 S2 “GXTXAYB”,首先将 S1 的第一个字符与 S2 的第一个字符比较,然后移除 S1 的第一个字符再与 S2进行比较…… 对 S2 做同样的操作。此时的情况如下图所示:

动态规划
- 动态规划在这里的解决的是重复子问题的类型,由于上文的递归方案,在这个解决过冲中存在大量的重复计算,因此可以使用动态规划存储中间计算结果,从而提高运行效率。
实现
递归
public class Solution {
public static int lcs(String s1, String s2) {
int len1 = s1.length(), len2 = s2.length(); // 递归终止条件
if (len1 == 1 || len2 == 1)
return s1.charAt(0) == s2.charAt(0) ? 1 : 0; // 递归剩下的结果得到该问题的解
if (s1.charAt(0) == s2.charAt(0))
return Math.max(
lcsRecur(s1.substring(1), s2),
lcsRecur(s1, s2.substring(1))
) + 1; return Math.max(
lcsRecur(s1.substring(1), s2),
lcsRecur(s1, s2.substring(1))
);
}
}
动态规划
public class Solution {
public static int lcs(String s1, String s2) {
// 将字符串转变为对应的字符数组,提高查找的速度
char[] s1Arr = s1.toCharArray();
char[] s2Arr = s2.toCharArray();
int row = s1Arr.length, col = s2Arr.length; // 存储中间计算结果的二维数组
int[][] dp = new int[row + 1][col + 1]; for (int i = 1; i <= row; ++i) {
for (int j = 1; j <= col; ++j) {
if (s1Arr[i - 1] == s2Arr[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[row][col];
}
}
动态规划问题(六)最长公共子序列(LCS)的更多相关文章
- 【动态规划】 之最长公共子序列LCS
int lcs_len(char *a, char *b, int c[][N]){ int aLen=strlen(a), bLen=strlen(b), i,j; ; i<=aLen; i+ ...
- 动态规划经典算法--最长公共子序列 LCS
转移方程 代码: //法一: #include <bits/stdc++.h> using namespace std; //---------------https://lunatic. ...
- 动态规划之最长公共子序列LCS(Longest Common Subsequence)
一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...
- 编程算法 - 最长公共子序列(LCS) 代码(C)
最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...
- C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
- POJ 1458 Common Subsequence(最长公共子序列LCS)
POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
- 51Nod 1006:最长公共子序列Lcs(打印LCS)
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 51nod 1006 最长公共子序列Lcs 【LCS/打印path】
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 每日一题-——最长公共子序列(LCS)与最长公共子串
最长公共子序列(LCS) 思路: 代码: def LCS(string1,string2): len1 = len(string1) len2 = len(string2) res = [[0 for ...
随机推荐
- strimzi实战之三:prometheus+grafana监控(按官方文档搞不定监控?不妨看看本文,已经踩过坑了)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 由于整个系列的实战都涉及到消息生产和消费,所 ...
- QQ机器人整理合集
QQ机器人有什么用呢? QQ机器人可以实现包括自动回复.定时推送.发送图片QQ机器人,营销圈用的比较多,可以开发各种自动功能等等.用其制作的QQ机器人程序 机器人框架+插件 小栗子机器人 官网:htt ...
- 【Unity3D】UI Toolkit样式选择器
1 前言 UI Toolkit简介 中介绍了样式属性,UI Toolkit容器 和 UI Toolkit元素 中介绍了容器和元素,本文将介绍样式选择器(Selector),主要包含样式类选择器(C ...
- 人工智能AI浪潮的掀起,打工人何去何从?
感谢你阅读本文 自从2022年11月30日OpenAI公司推出了ChatGPT,至今一年了,而这一年国内也发生了天翻地覆的变化,各大厂商纷纷推出了自己的大模型和解决方案,例如百度的文心一言,阿里的通义 ...
- 简单实现.NET Hook与事件模拟
最近玩<星露谷物语>上瘾,本来是看着个休闲游戏,现在玩成修仙游戏了,上百个小时浑身是肝,中午午休习惯都强行给改了. 虽然挺有意思,但是太肝了,入坑前请谨慎.补充一下,这个游戏应该是基于 X ...
- AttributeError: module 'sqlalchemy' has no attribute '__all__'
升级组件 pip install --upgrade flask-sqlalchemy
- 21. 从零用Rust编写正反向代理,tokio竟然这样对待socket!
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...
- SSL证书链及使用
什么是证书链 证书链简单来说是域名钥证书.CA公钥.根证书形成的一个颁发链条,属于公钥的一部分. 更白话一点,就是证书链文件包含一系列CA机构公钥的证书. 证书链格式 一般证书链格式是.chain,证 ...
- 深入理解JMeter中的JSON Extractor
Apache JMeter是一款出色的开源性能和功能测试工具,这款工具提供了丰富的功能和强大的扩展性,可以应对各种复杂的测试需求.当我们在进行接口测试时,经常会遇到需要从接口响应中提取信息并在后续请求 ...
- Codeforces Round #736 (Div. 2). D - Integers Have Friends
原题:D - Integers Have Friends 题意: 给定一个数组,求一个最长子数组满足\(a_i \,\, mod \,\, m \,\, = \,\, a_{i + 1} \,\, m ...