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


    问题内容:

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

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

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

    希望对大家有所帮助

    以上

  • 相关阅读:
    解决sqlite3 dos下显示中文乱码
    毕业两年
    成就感
    重构html的下拉框select
    ie6 select不兼容处理(转)
    全选删除确认改进
    GridView移动行变色
    gridview固定列的宽度并且能换行
    分页控件结合分页存储过程
    网页滚动条向下拉动奇慢的原因
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/10525831.html
Copyright © 2020-2023  润新知