问题内容:
求两个字符串的公共最长子序列长度
注:子序列是一个字符串内部若干个元素,可以不连续;子串是连续的一串字符,此处不要有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
总结:关于递归逻辑分析的一点儿小技巧:只用管第一层递归所要做的事情,因为后面都是一样的,只要把第一层的逻辑整理清楚,后面的直接丢到创建的函数里就行了,一层一层的分析反而麻烦,是在搞不清的话,就把每一层的数据在纸上写出来,写出一两层的时候逻辑就一目了然了,个人见解,有不当之处还请提出/抱拳/抱拳
希望对大家有所帮助
以上