题目
给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的先后顺序一致。
思路
动态规划
状态
定义一个二维数组maxCommon[i][j],1字符串中前i个字符和2字符串中前j个字符公共子序列长度初始状态
maxCommon[i][0] = 0
maxCommon[0][j] = 0状态转移
若字符相同,maxCommon[i][j] = maxCommon[i-1][j-1] + 1;
若字符不同,maxCommon[i][j] = Math.max(maxCommon[i][j-1],maxCommon[i-1][j]);
代码
递推实现
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s1 = scan.nextLine();
String s2 = scan.nextLine();
int ns1 = s1.length();
int ns2 = s2.length();
int[][] maxCommon = new int[ns1+1][ns2+1];
for(int i=1; i<=ns1; i++){
for(int j=1; j<=ns2; j++){
if(s1.charAt(i-1) == s2.charAt(j-1))
maxCommon[i][j] = maxCommon[i-1][j-1]+1;
else
maxCommon[i][j] = Math.max(maxCommon[i-1][j],maxCommon[i][j-1]);
}
}
System.out.println(maxCommon[ns1][ns2]);
}
}
递归实现
public static int maxCommon(String s1, String s2, int i, int j) {
if (i == 0 || j == 0)
return 0;
if (s1.charAt(i-1) == s2.charAt(j-1))
return maxCommon(s1, s2, i - 1, j - 1)+1;
else
return Math.max(maxCommon(s1, s2, i , j - 1),maxCommon(s1, s2, i - 1, j));
}