算法基础_递归_求两个字符串的公共最长子序列长度

问题内容:

求两个字符串的公共最长子序列长度

注:子序列是一个字符串内部若干个元素,可以不连续;子串是连续的一串字符,此处不要有confusion

解题源代码如下:

/**
 *     求两个字符串公共子序列的最大长度
 *    子串:中间必须连续
 *    子序列:是字符串中的一些元素
 * @author Administrator
 *
 */
public class Dmo03 {
    static int counter = 0;
    
    public static int f(String str1,String str2) {
        if(str1.length()==0||str2.length()==0)return 0;
        
        if(str1.charAt(0)==str2.charAt(0))
            return f(str1.substring(1),str2.substring(1))+1;
        else
            return Math.max(f(str1.substring(1),str2),f(str2.substring(1),str1));
    }
    
    
    public static void main(String[] args) {
        System.out.println(f("abcasdfdafadfsdf","scbcdaasdfadfadsdfasf"));
        //System.out.println("abc".substring(1));
    }
}

解题思路:

分三步:1.先判断头部 ,如果头部相等,将字符串除头部以外的子串切下来给下一层递归

    2.如果头部不相等,则让递归产生分支,利用Math包里的“max”方法,传入两种情况——假设字符串是A、B两个,则第一种情况传入A字符串去掉头部之外的部分和B,第二种情况则传入B字符串除掉头部之外的部分和A

    3.设置递归退出条件,仔细想一下就可以知道,当某一个字符串的长度变为零时,最大子序列的长度就已经生成了,即判断条件为(A的长度是否为为零||B的长度是否为零),如果是,则返回0

总结:关于递归逻辑分析的一点儿小技巧:只用管第一层递归所要做的事情,因为后面都是一样的,只要把第一层的逻辑整理清楚,后面的直接丢到创建的函数里就行了,一层一层的分析反而麻烦,是在搞不清的话,就把每一层的数据在纸上写出来,写出一两层的时候逻辑就一目了然了,个人见解,有不当之处还请提出/抱拳/抱拳

希望对大家有所帮助

以上

原文地址:https://www.cnblogs.com/lavender-pansy/p/10525831.html