1 public class CommonSubsequence { 2 3 public static int f(String s1,String s2){ 4 5 if(s1.length()==0||s2.length()==0) return 0; 6 7 if(s1.charAt(0)==s2.charAt(0)) 8 return f(s1.substring(1),s2.substring(1))+1; 9 else 10 return Math.max(f(s1.substring(1),s2), f(s1,s2.substring(1))); 11 12 } 13 14 15 public static void main(String[] args) { 16 int k =f("abc","xbacd"); 17 System.out.println(k); 18 } 19 20 }
Notes:
①String s.charAt(int index)返回字符串中下标为index的字符;
String s.subString(int beginIndex,int endIndex)返回字符串的子字符串,包括下标为beginIndex,不包括下标为endIndex;
Math类中的方法都被定义为static形式,Math类可以在主函数中直接调用;
Math.max(int a,int b)返回两个参数中的最大值,参数可以是float、byte、double类型;
②使用递归只能求出其长度,相比列举序列要简单许多(动态规划);递归步骤过于复杂;
③字符串a:xasfas 字符串b:as
字符串a的第一个字符==字符串b的第一个字符 -->> 两遍都剩余的字符串求公共子序列长度+1
字符串a的第一个字符!=字符串b的第一个字符 -->>a除第一个字符以外和b所求公共子序列长度
-->>a和b除第一个字符以外所求公共子序列长度
a或b序列长度为0时-->>0(出口)