import java.util.Timer;
public class LCS {
static int[][] memoryDP = new int[100][100];
public static void main(String[] args) {
String str1 = "abfdasgffdvddgfdvcq";
String str2 = "vfdcsdcewfedsesq";
// fdsq
long timeMillis = System.currentTimeMillis();
int length = lcs(str1, str2, str1.length(), str2.length());
System.out.println(System.currentTimeMillis() - timeMillis);
long timeMillis2 = System.currentTimeMillis();
System.out.println(length);
int length2 = lcsDP(str1, str2, str1.length(), str2.length());
System.out.println(System.currentTimeMillis() - timeMillis2);
System.out.println(length2);
}
// 递归 +DP
private static int lcsDP(String str1, String str2, int m, int n) {
if (m == 0 || n == 0) {
return 0;
}
if (memoryDP[m - 1][n - 1] != 0) {
return memoryDP[m - 1][n - 1];
} else if (str1.charAt(m - 1) == str2.charAt(n - 1)) {
memoryDP[m - 1][n - 1] = lcs(str1, str2, m - 1, n - 1) + 1;
return memoryDP[m - 1][n - 1];
}
memoryDP[m - 1][n - 1] = max(lcs(str1, str2, m - 1, n), lcs(str1, str2, m, n - 1));
return memoryDP[m - 1][n - 1];
}
// 递归
private static int lcs(String str1, String str2, int m, int n) {
if (m == 0 || n == 0) {
return 0;
}
if (str1.charAt(m - 1) == str2.charAt(n - 1)) {
return lcs(str1, str2, m - 1, n - 1) + 1;
} else {
return max(lcs(str1, str2, m - 1, n), lcs(str1, str2, m, n - 1));
}
}
private static int max(int lcs1, int lcs2) {
return lcs1 > lcs2 ? lcs1 : lcs2;
}
}