
7-26 最长公共子序列
初始化:当 比较字符:如果字符 递推关系:如果字符不相同,那么
输入读取:使用 动态规划数组 填充 输出结果:打印
发布日期:2021-05-10 23:56:04
浏览次数:18
分类:精选文章
本文共 1293 字,大约阅读时间需要 4 分钟。
最长公共子序列(LCS)的问题可以通过动态规划来解决。以下是解决这个问题的详细步骤和代码实现。
方法思路
我们使用一个二维数组 dp[i][j]
来表示在字符串 a
的前 i
个字符和字符串 b
的前 j
个字符中最长公共子序列的长度。方法如下:
i
或 j
为0时,dp[i][j]
设为0,因为一个空字符串的子序列长度为0。a[i]
等于字符 b[j]
,则 dp[i][j] = dp[i-1][j-1] + 1
,因为当前字符可以延续之前的最长公共子序列。dp[i][j]
取决于 dp[i-1][j]
和 dp[i][j-1]
中的最大值。这个选择表示我们可以从前一个字符或者前面字符得到更长的公共子序列。通过填充整个二维数组,dp[m][n]
就会给出两个字符串的最长公共子序列的长度。
代码实现
#include#include using namespace std;int main() { string a, b; cout << "请输入两个字符串:\n"; cin >> a; cin >> b; int m = a.size(); int n = b.size(); int dp[m+1][n+1]; // 初始化 for(int i = 0; i <= m; ++i) { for(int j = 0; j <= n; ++j) { if(i == 0 || j == 0) { dp[i][j] = 0; } else { if(a[i-1] == b[j-1]) { dp[i][j] = dp[i-1][j-1] + 1; } else { dp[i][j] = max(dp[i-1][j], dp[i][j-1]); } } } } cout << dp[m][n] << endl; return 0;}
代码解释
cout
和 cin
读取两个字符串 a
和 b
。dp
初始化:大小为 (m+1) x (n+1)
,其中 m
和 n
分别是字符串 a
和 b
的长度。dp
数组: - 对于
i=0
或j=0
,dp[i][j]
设为0,因为无效情况。 - 如果当前字符相等,
dp[i][j] = dp[i-1][j-1] + 1
。 - 如果当前字符不等,
dp[i][j]
取决于前面两种可能的最长值。
dp[m][n]
,即两个字符串的最长公共子序列的长度。发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月17日 16时58分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
跟小静读CLR via C#(15)--String,熟悉而又陌生
2019-03-16
升级java11后,maven命令打包报错
2019-03-16
python【5】-生成式,生成器
2019-03-16
JAVA入门[4]-IntelliJ IDEA配置Tomcat
2019-03-16
springboot redis key乱码
2019-03-16
Win10禁用自带的笔记本键盘
2019-03-16
shell及脚本1——变量
2019-03-16
insmod模块的几种常见错误
2019-03-16
shell及脚本4——shell script
2019-03-16
make工程管理器
2019-03-16
写时复制集合 —— CopyOnWriteArrayList
2019-03-16
给大家介绍下,这是我的流程图软件 —— draw.io
2019-03-16
【Elasticsearch 技术分享】—— ES 查询检索数据的过程,是什么样子的?
2019-03-16
什么是redis的缓存雪崩, 穿透, 击穿?
2019-03-16
数据帧CRC32校验算法实现
2019-03-16
【转载】DSP基础--定点小数运算
2019-03-16
idea thymeleaf页面变量报错解决
2019-03-16
云游戏,打响5G第一战
2019-03-16
Docker 拉取镜像速度太慢
2019-03-16
关于window匿名通道的使用以及所遇到的问题
2019-03-16