一、递归
public static int way01(String str1, String str2) {
if (str1 == null || str2 == null || str1.length() == 0 || str2.length() == 0) {
return 0;
}
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
return process01(s1, s1.length - 1, s2, s2.length - 1);
}
// s1[0-range1]与s2[0-rang2]范围上的最长公共子序列
//最长子序列在[0-rang1) [0-rang2]
//最长子序列在[0-rang1] [0-rang2)
//最长子序列在[0-rang1] [0-rang2]
private static int process01(char[] s1, int range1, char[] s2, int range2) {
if (range1 == 0 && range2 == 0) {
return s1[range1] == s2[range2] ? 1 : 0;
}
if (range1 == 0) {
if (s1[range1] == s2[range2]) {
return 1;
} else {
return process01(s1, range1, s2, range2 - 1);
}
}
if (range2 == 0) {
if (s1[range1] == s2[range2]) {
return 1;
} else {
return process01(s1, range1 - 1, s2, range2);
}
}
//最长子序列在[0-rang1) [0-rang2]
//最长子序列在[0-rang1] [0-rang2)
//最长子序列在[0-rang1] [0-rang2]
int p1 = process01(s1, range1 - 1, s2, range2);
int p2 = process01(s1, range1, s2, range2 - 1);
int p3 = s1[range1] == s2[range2] ? process01(s1, range1 - 1, s2, range2 - 1) + 1 : 0;
return Math.max(p1, Math.max(p2, p3));
}
二、动态规划
public static int way02(String str1, String str2) {
if (str1 == null || str2 == null || str1.length() == 0 || str2.length() == 0) {
return 0;
}
char[] s1 = str1.toCharArray();
int N1 = s1.length;
char[] s2 = str2.toCharArray();
int N2 = s2.length;
int[][] dp = new int[N1][N2];
for (int range1 = 0; range1 < N1; range1++) {
for (int range2 = 0; range2 < N2; range2++) {
if (range1 == 0 && range2 == 0) {
dp[0][0] = s1[0] == s2[0] ? 1 : 0;
} else if (range1 == 0) {
dp[range1][range2] = s1[range1] == s2[range2] ? 1 : dp[range1][range2 - 1];
} else if (range2 == 0) {
dp[range1][range2] = s1[range1] == s2[range2] ? 1 : dp[range1 - 1][range2];
}
else {
int p1 = dp[range1 - 1] [range2];
int p2 = dp[range1][range2-1];
int p3 = s1[range1] == s2[range2] ? dp[range1-1][range2-1]+1 : 0;
dp[range1][range2] = Math.max(p1, Math.max(p2, p3));
}
}
}
return dp[N1 - 1][N2 - 1];
}