解释:
子序列和子串的区别(主串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)的字符串长度大小,如果前者大返回前者,反之后者
}
}
}
示例:
![](https://i-blog.csdnimg.cn/blog_migrate/ccc9bf24632963af863de2476d063128.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/23217cd935f2d3cd56cbcfdc75288f7f.png)