问题描述

​ 给你两个字符串,要求得到这两个字符串的最长公共子序列长度。

​ 比如:对于输入的字符串 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)的更多相关文章

  1. 【动态规划】 之最长公共子序列LCS

    int lcs_len(char *a, char *b, int c[][N]){ int aLen=strlen(a), bLen=strlen(b), i,j; ; i<=aLen; i+ ...

  2. 动态规划经典算法--最长公共子序列 LCS

    转移方程 代码: //法一: #include <bits/stdc++.h> using namespace std; //---------------https://lunatic. ...

  3. 动态规划之最长公共子序列LCS(Longest Common Subsequence)

    一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...

  4. 编程算法 - 最长公共子序列(LCS) 代码(C)

    最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...

  5. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  6. 1006 最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...

  7. POJ 1458 Common Subsequence(最长公共子序列LCS)

    POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...

  8. 51Nod 1006:最长公共子序列Lcs(打印LCS)

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  9. 51nod 1006 最长公共子序列Lcs 【LCS/打印path】

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  10. 每日一题-——最长公共子序列(LCS)与最长公共子串

    最长公共子序列(LCS) 思路: 代码: def LCS(string1,string2): len1 = len(string1) len2 = len(string2) res = [[0 for ...

随机推荐

  1. strimzi实战之三:prometheus+grafana监控(按官方文档搞不定监控?不妨看看本文,已经踩过坑了)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 由于整个系列的实战都涉及到消息生产和消费,所 ...

  2. QQ机器人整理合集

    QQ机器人有什么用呢? QQ机器人可以实现包括自动回复.定时推送.发送图片QQ机器人,营销圈用的比较多,可以开发各种自动功能等等.用其制作的QQ机器人程序 机器人框架+插件 小栗子机器人 官网:htt ...

  3. 【Unity3D】UI Toolkit样式选择器

    1 前言 ​ UI Toolkit简介 中介绍了样式属性,UI Toolkit容器 和 UI Toolkit元素 中介绍了容器和元素,本文将介绍样式选择器(Selector),主要包含样式类选择器(C ...

  4. 人工智能AI浪潮的掀起,打工人何去何从?

    感谢你阅读本文 自从2022年11月30日OpenAI公司推出了ChatGPT,至今一年了,而这一年国内也发生了天翻地覆的变化,各大厂商纷纷推出了自己的大模型和解决方案,例如百度的文心一言,阿里的通义 ...

  5. 简单实现.NET Hook与事件模拟

    最近玩<星露谷物语>上瘾,本来是看着个休闲游戏,现在玩成修仙游戏了,上百个小时浑身是肝,中午午休习惯都强行给改了. 虽然挺有意思,但是太肝了,入坑前请谨慎.补充一下,这个游戏应该是基于 X ...

  6. AttributeError: module 'sqlalchemy' has no attribute '__all__'

    升级组件 pip install --upgrade flask-sqlalchemy

  7. 21. 从零用Rust编写正反向代理,tokio竟然这样对待socket!

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  8. SSL证书链及使用

    什么是证书链 证书链简单来说是域名钥证书.CA公钥.根证书形成的一个颁发链条,属于公钥的一部分. 更白话一点,就是证书链文件包含一系列CA机构公钥的证书. 证书链格式 一般证书链格式是.chain,证 ...

  9. 深入理解JMeter中的JSON Extractor

    Apache JMeter是一款出色的开源性能和功能测试工具,这款工具提供了丰富的功能和强大的扩展性,可以应对各种复杂的测试需求.当我们在进行接口测试时,经常会遇到需要从接口响应中提取信息并在后续请求 ...

  10. Codeforces Round #736 (Div. 2). D - Integers Have Friends

    原题:D - Integers Have Friends 题意: 给定一个数组,求一个最长子数组满足\(a_i \,\, mod \,\, m \,\, = \,\, a_{i + 1} \,\, m ...