递归求两个串的最大公共子序列的长度

解释:

子序列和子串的区别(主串abcdef)

1.子序列:是可以间隔的。比如:abc,abd,bdef

2.子串:是连着的,不能有间隔。比如:abc,bcd,def

思路:

考虑三种情况:

第一种:首字母相同

如果首字母相同,则从第二位开始进行比较,用substring()方法进行切割,获取后面的字符串,将后面的字符串作为参数传入getSub()方法中,依次进行比较得出最大公共子序列,并返回其长度。

第二种:首字母不同

如果首字母不同,则比较两个字符串谁大,返回大的。就比如s1比s2大,则s1的字符串不变,s2从第二位开始,舍弃第一个字母,最后再将新的s1和s2作为参数传入getSub()方法中。

第三种:其中有一个字符串长度为0

如果有字符串为0,那最大公共子序列的长度肯定为0,直接return 0。

package Lq_算法练习;
public class Demo_递归05 {
    public static void main(String[] args) {
        int num=getSub("abc","bacd");
        System.out.println("最大公共子序列长度为:"+num);
    }
    public static int getSub(String s1,String s2) {
        if(s1.length()==0||s2.length()==0) {
            return 0;
            //如果长度为0,则最大公共子序列的长度一定为0
        }
        if(s1.charAt(0)==s2.charAt(0)) {
            return getSub(s1.substring(1),s2.substring(1))+1;
//如果开头字母一样,则从后面开始比较,+1表示最后把第一位加上则和原来字符串的长度一样
        }else {
            return Math.max(getSub(s1.substring(1),s2), getSub(s1,s2.substring(1)));
//比较getSub(s1.substring(1),s2)和getSub(s1,s2.substring(1)的字符串长度大小,如果前者大返回前者,反之后者
        }
    }
}

示例:

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值