zoukankan      html  css  js  c++  java
  • 算法基础_递归_求两个字符串的公共最长子序列长度

    问题内容:

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

    注:子序列是一个字符串内部若干个元素,可以不连续;子串是连续的一串字符,此处不要有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

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

    希望对大家有所帮助

    以上

  • 相关阅读:
    WPF之感触
    C# WinForm 给DataTable中指定位置添加列
    MyEclipse 8.6 download 官方下载地址
    将博客搬至CSDN
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/10525831.html
Copyright © 2011-2022 走看看