关于寻找两个字符串中最长子序列的问题

本文探讨了如何找到两个字符串之间的最长子序列,包括递归和动态规划两种解法,并给出了优化的Java代码实现。最长子序列是指两个字符串中相同字符组成且下标递增的部分,例如在字符串“abdcegs”和“wbcasq”中,“bcs”是最长子序列。文章还提出了减少循环次数的优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先先来介绍一下最长子序列是什么
按照我的理解,最大子序列首先是两个串中相同的字符组成的,在两个字符串中,相同的字符可以不连续,但是必须字符的下标在字符串中是一次递增的。
举个简单的例子:
String “abdcegs”;
String “wbcasq”;
在这两个串中子序列有“as”,“bcs‘’
最大子序列为“bcs”

这种题我一共遇到两个解法,现在分享出来

第一种解法:递归解决

解法思路:
首先判断两个字符串的第一个字符是否相等
如果相等,则求两个去掉第一个字符的的子序列+1;
如果不相等,则求(去掉第一个字符的第一个字符串与第二个字符串的子序列)和(第一个字符串与去掉第一个字符的第二个字符串的子序列)

代码实现(java)

   public static int f(String s1, String s2) {

        if(s1.length()==0||s2.length()==0) 
            return 0;

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

解法二:动态规划
解法思路:
实现步骤

注意:每次字符相同时,需要判断 矩阵[当前位置y轴-1][当前位置x轴-1]的最大值+1;

代码实现(java)

    public static 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值