利用动态规划和递归分别求两个串的最大公共子序列

求两个串的最大公共子序列的长度(用递归) 求最大公共子序列长度(递归可解) 注意: 1、优化解,则可以采用动态规划。 2、子序列和子串区分: 例:abcd。abd是他的子序列,但不是子串。子串是连续的,子序列可以不连续。 3、Math.max()函数,用于找出两个指定的数的较大的一个。 递归思想: 1、假若两个串的第一个字符相同,则长度+1,并找出除第一个字符外的子串。 2、如果不相同,有两种方法,可以将s1和s2除第一个字符外的子串比较... 阅读详情

利用动态规划和递归分别求两个串的最大公共子序列

这里写图片描述
相关代码

/*
 * 求两个子串的最大公共子序列      
 */
public class Msin {
    /*
     * 1.利用递归的思想来处理的求最大公共子序列
     */
    public static int f(String str, String str2){
        if(str.length() == 0 || str2.length() == 0) return 0;

        if(str.charAt(0) == str2.charAt(0))
            return f(str.substring(1),str2.substring(1)) + 1;
        else
            return Math.max(f(str.substring(1), str2), f(str, str2.substring(1)));
    }

    /*
     * 2.利用动态规划来解决问题减小了时间复杂度
     */
    public static int LCS(String str1, String str2){
        int[][] c = new int[str1.length()+1][str2.length()+1];  //建立矩阵
        for(int row=0; row<=str1.length(); row++){
            c[row][0] = 0;
        }
        for(int col=0; col<=str2.length(); col++){
            c[0][col] = 0;
        }
        //关键代码
        for(int i=1; i<=str1.length(); i++){
            for(int j=1; j<=str2.length(); j++){
                if(str1.charAt(i-1) == str2.charAt(j-1)){
                    c[i][j] = c[i-1][j-1] + 1;
                }else if(c[i][j-1] > c[i-1][j]){
                    c[i][j] = c[i][j-1];
                }else{
                    c[i][j] = c[i-1][j];
                }
            }
        }
        return c[str1.length()][str2.length()];
    }
    public static void main(String[] args) {
        int result = LCS("ABCBDAB", "BDCADA");
        System.out.println(result);
    }

}
数据结构--寻找最大公共子串的C语言实现(超详细注释/实验报告) 在计算机科学中,最长公共子串问题是寻找两个或多个已知字符串最长的子串。此问题与最长公共子序列问题的区别在于子序列不必是连续的,而子串却必须是。 阅读详情

相关推荐

动态规划 最长公共子序列 过程图解

1.基本概念       首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。给一个图再解释一下:        如

hrn1216的博客 29万+

编程实现查找两个字符串的最大公共子串 示例:"aocdfe"和"pmcdfa"最大公共子串为"cfd"

#include #include #define none -1 int fun(char *str1,char *str2) { char *p1=str1; char *p2=str2; int i,j,temp; if(*str1=='\0'||*str2=='0') return none; for(i=0;i<strlen(str);i++) { temp=0;

JeremyZJM的博客 574

C++ 动态规划经典案例解析之最长公共子序列(LCS)_窥探递归和动态规划的一致性

动态规划处理字符相关案例中,求最长公共子序列以及求最短编辑距离,算是经典中的经典案例。讲解此类问题的算法在网上一抓应用一大把,即便如此,还是忍不住有写此文的想法。毕竟理解、看懂都不算是真正掌握,唯有瞧出其中玄机,能有自己独有的见解和不一样的感悟方算是把知识学到灵魂深入。好了!闲话少说,进入正题。最长公共子序列很有代表性,分析基于递归和动态规划的实现过程,可以帮助我们理解此类问题,且解决此类问题。

y6123236的专栏 2654

动态规划求解两个字符串的最长公共子序列

最简单的递归便宜方程为 LCS(m,n):求s1[0...m] 和s2[0...n]的最长公共子序列changdu 偏移状态: s1[m] ==s2[n]?1+LCS(m-1,n-1):max(LCS(m-1,n),LCS(m,n-1)) 详细代码: public class Wigglemaxlength { private char[] s1; p...

qq_38522268的博客 1353

动态规划算法下的序列问题:最长公共子序列问题和最大子段和问题

本篇主要介绍最长公共子序列问题和最大子段和问题 1、最长公共子序列问题 什么是最长公共子序列 给定一个序列X=<x1,x2,x3,x4…,xm>,另一个序列Z=<z1,z2,z3,z4…,zk>,若存在一个严格递增的X的下标序列<i1,i2,i3,…,ik>对所有的1,2,3,…,k,都满足x(ik)=zk,则称Z是X的子序列 比如说:比如Z=<B,C,D...

qq_41926985的博客 2706

最长公共子序列问题(动态规划求解)

问题       求长为m的序列和长为n的序列的最长公共子序列(可以不连续),如ABCBDAB和BDCABA,BCAB和BCBA都是它们的最长公共子序列。在生物学上用来求DNA序列的匹配度。这里我们用它来举例学习动态规划方法。 先放结论:       动态规划是暴力递归的一种优化。要写出动态规划,首先要写出递归式,然后试着找出最优子结构与重叠子问题。 1.最优子结构就是一个问题的最优解

l-jobs的专栏 8022

动态规划——最长公共子序列

动态规划之最长公共子序列(PTA)

Wu_L7的博客 1万+

求两个字符串的最长公共子序列 合工大 程序设计艺术实验四

求两个字符串的最长公共子序列. X的一个子序列是相应于X下标序列{1, 2, …, m}的一个子序列,求解两个序列的所有子序列中长度最大的,例如输入:pear,peach输出pea. #include <iostream> #include <stdio.h> #include <string.h> #define MAXLEN 100 using namespace std; void LCSLength(char *x, char *y, int m, int

qq_42650433的博客 2147

最长公共子序列问题:从暴力递归到动态规划详解

text2[j-1],则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])。如果当前字符相等,则公共子序列的长度加一,并递归地继续比较剩下的部分。• 如果 text1[i-1] == text2[j-1],则 dp[i][j] = dp[i-1][j-1] + 1。• 如果两个字符串的当前字符相等,则公共子序列的长度可以增加 1,递归地处理去掉这两个字符后的子问题。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。

Mr.Ayao's blog 2176

求最大公共子串.cpp

求最大公共子串 s1和s2最长公共子串 c/c++源代码

论文阅读《Eigen-GNN: A Graph Structure Preserving Plug-in for GNNs》

好久没看论文了,感觉好生疏 关于这篇文章的大致脉络,这篇文章已经介绍过了。

且视他人之疑目如盏盏鬼火,大胆地去走你的夜路 461

动态规划-----最长公共子序列(及其衍生问题)

目录一.最长公共子序列的基本概念:解决动态规划问题的一般思路(三大步骤):二.最长公共子序列题目:三.字符串的删除操作:四.最小 ASCII 删除和:首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。给一个图再解释一下:最长公共子序列,顾名思

2302_79862386的博客 4709

ABB机器人ModbusTCP通信实战:如何高效传输Float数据到PLC(附完整代码)

本文详细介绍了ABB机器人通过ModbusTCP协议高效传输Float数据到PLC的实战方法,包括底层逻辑解析、RAPID程序架构设计、PLC服务器配置及现场调试技巧。特别针对浮点数据传输中的字节顺序问题提供了解决方案,并附有完整代码示例,助力工程师快速实现工业自动化设备间的高精度数据交互。

weixin_30836759的博客 482

【动态规划】LCS算法:求两字符串最大公共子序列/删除字符使成为回文串

问题描述:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。 例如:输入:google 输出:2 思路:回文串通常可以用逆序的方式寻找思路。例如字符串google逆序后elgoog,字符串alibaba逆序后ababila,可以发现求回文串的问题可以转换成求两个字符串的最大公共子序列的问题(序列可以不连续)。 需要删除的

HiPricilla的博客 2028

超螺旋滑模控制(STA)

超螺旋滑模控制又称超扭滑模控制,可以说是二阶系统中最好用的滑模控制方法。

Lyajpunov的博客 1万+

从零到英雄:WSL2与Ubuntu22.04的终极性能调优指南

本文详细介绍了如何在Windows系统中通过WSL2与Ubuntu22.04进行性能调优,涵盖内核定制、GPU加速、网络优化等关键技巧,帮助开发者打造媲美原生Linux的高性能开发环境,特别适合AI训练和大数据处理等资源密集型任务。

weixin_29218509的博客 523

动态规划算法(2)--最大子段和与最长公共子序列

最大子段和的暴力枚举、分治法、动态规划法的思路,最长公共子序列暴力检索、动态规划法的思路。

NPU 研0 5605

RV1126B芯片实战:如何用这款视觉处理器SoC打造你的第一个AI摄像头项目

本文详细介绍了如何利用瑞芯微RV1126B视觉处理器SoC从零构建AI摄像头项目。涵盖硬件选型、开发环境搭建、ISP配置、AI模型部署及系统集成等关键步骤,帮助开发者高效实现边缘计算方案,特别适合智能安防和工业检测应用。

dropout6artist的博客 930

求最大公共子序列问题

问题描述: 给定两个字符串s1和s2;输出它们的最大公共子序列。 子序列和子数组不同,子数组是连续的;而子序列不要求是连续的,只要前后顺序关系一致就行。 例如: 输入: AB34C A1BC2 输出: ABC 输入: 3563243 513141 输出: 534 解法一: 用递归的解法,遍历其中一个字符串,对其中的每一个字母在另一个字符串中找相同。找到后把剩余的字符串进行下一轮的递归。即在双层循环...

覃会程的博客 1390

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式如何计算IC电源管脚电感操作指导

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式可以计算电容到IC电源管脚的电感,用于评估电容位置对于IC电源管脚的效果,如何分析,以下图为例进行说明。Capacitors:选择层面,这里选择top layer(IC在top层),下方可以选择电容的size,这里选择All Size。IC devices,输入U*, A*, B*, Q*, P*,将所有这些字母开头的器件都识别为IC。模式如何计算IC电源管脚电感操作指导。

weixin_54787054的博客 408

uniapp - H5网页uni.getLocation报错getLocation:fail Geolocation permission denied.Get ipLocation failed.

uni.getLocation getLocation:fail Geolocation permission denied.Get ipLocation failed.,uni.getLocation定位失败,uni-app getLocation()无法获取定位,一直fail()uniapp移动端h5网页,uniApp微信内置浏览器定位失败,如何解决这个问题,uniapp h5 uni.getLocation获取位置失败怎么办,UNI-APP获取当前位置,uni.getLocation定位失败,unia

🏆 前端领域优质创作者 4241

动态规划求解最长公共子序列、最大字段和、最长单调递增子序列

最长公共字段

weixin_53522240的博客 2117

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【动态规划】输出两个序列的所有的最长公共子序列(java)

要解决的问题就是如何找出两个序列的全部公共子序列。

shixixiya6的博客 4881

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

动态规划算法求解最长公共子序列

动态规划算法是运筹学中求解多阶段决策问题的经典算法,本文将介绍动态规划算法的基本思想,并介绍如何使用动态规划算法求解最长公共子序列问题。

fufufunny的博客 3010

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

动态规划、递归求解最长公共子序列

递归: 指通过重复将问题分解为同类的子问题而解决问题的方法,递归的逻辑简单,但是内存占用大。 分治策略: 将原问题分解为若干个规模较小但类似于原问题的子问题(分),递归求解这些子问题,然后再合并这些子问题的解来建立原问题的解(治)。 动态规划: 动态规划其实和分治策略是类似的,也是将一个原问题分解为若干个规模较小的子问题,递归的求解这些子问题,然后合并子问题的解得到原问题的解。不同在于动态规划解决了重叠子问题,避免子问题在求解之后再次求解而产生更多的时间消耗。 所以分治策略一般用来解决子问题相互对立的问题,

weixin_43827397的博客 1616
上一篇: JAVA之查找二叉树ADT
下一篇: JAVA之查找二叉平衡树
LuFei_java
博客等级 码龄10年 1粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值