public class LCS {
private enum Path {TOP, LEFT, TOP_LEFT};
private static int[][] commonLenth;
private static Path[][] path;
private static String stringA = "ABCBDAB";
private static String stringB = "BDCABA";
/**
* @param args
*/
public static void main(String[] args) {
lCS_Lenght(stringA, stringB);
printlnArray();
print_LCS(path, stringA, stringA.length(), stringB.length());
}
private static int lCS_Lenght(String a, String b) {
int m = a.length();
int n = b.length();
commonLenth = new int[m + 1][n + 1];
path = new Path[m + 1][n + 1];
for(int i = 0; i <= m; i++) {
commonLenth[i][0] = 0;
}
for (int j = 0; j<= n; j++) {
commonLenth[0][j] = 0;
}
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
if (a.charAt(i - 1) == b.charAt(j - 1)) {
commonLenth[i][j] = commonLenth[i - 1][j - 1] + 1;
path[i][j] = Path.TOP_LEFT;
} else {
if (commonLenth[i - 1][j] >= commonLenth[i][j - 1]) {
commonLenth[i][j] = commonLenth[i - 1][j];
path[i][j] = Path.TOP;
} else {
commonLenth[i][j] = commonLenth[i][j - 1];
path[i][j] = Path.LEFT;
}
}
}
}
System.out.println("LCS_length: " + commonLenth[m][n]);
return commonLenth[m][n];
}
// 从 path[][] 最后一个输出。
private static void print_LCS(Path[][] path, String a, int i, int j) {
if (i == 0 || j == 0) {
return;
}
if (path[i][j] == Path.TOP_LEFT) {
print_LCS(path, a, i - 1, j - 1);
System.out.print(a.charAt(i - 1));
} else {
if (path[i][j] == Path.TOP) {
print_LCS(path, a, i - 1, j);
} else {
print_LCS(path, a, i, j - 1);
}
}
}
private static void printlnArray() {
int m = stringA.length();
int n = stringB.length();
for (int i = 0; i <= m; i++) {
for (int j = 0; j<= n; j++) {
System.out.print(commonLenth[i][j] + " ");
}
System.out.println();
}
System.out.println("*****************");
Formatter formatter = new Formatter(System.out);
for (int i = 0; i <= m; i++) {
for (int j = 0; j<= n; j++) {
// System.out.print(path[i][j] + " ");
formatter.format("%-9s", path[i][j]);
}
System.out.println();
}
}
}
分享到:
相关推荐
由此函数,把序列X={x1,x2….xm}和Y={y1,y2…ym}的最长公共子序列的搜索分为M个阶段,第1阶段,按照式1计算X1和Yj的最长公共子序列长度L[1][j](1),第2阶段,按照2式计算X2和Yj的最长公共子序列长度L[2][j](1),...
java解决动态规划中最长公共子序列(longest common sequence)问题
最长不升公共子序列问题的动态规划算法,结果求出了子序列的长度以及该子序列是什么,采用的是Java。
最长公共子序列 获取两个序列的最长公共子序列的长度。 使用动态规划。
当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表... 下载 使用Maven: <groupId>info.debatty <artifactId>java-...
leetcode 2 sum c LeetCode There ...来表示序列X的i位和序列Y的j位之前的最长公共子序列的长度。那么如果X[i] == Y[j],dp[i][j] = dp[i + 1][j + 1] + 1;否则dp[i][j] = max{d[[i - 1][j], dp[i][j -
当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表...下载使用NuGet: Install-Package F23.StringSimilarity总览下面介绍了...
最长公共子序列 八皇后问题 dp 出栈次序 给定一个足够大的栈,进栈序列为1,2,3,…,n,求有多少个不同的出栈序列个数 Catalan number 套用通项公式即可, 1, 2, 5, 14, 42, 132 看到前面几个数是这个,也基本都是...
求最长公共子序列LCS 矩阵连乘问题 爬楼梯问题 找零问题 0-1背包问题 分治算法Divide and Conquer 应用:归并排序 其它 Rabin fingerprints 文件指纹算法 BitMap 位图算法 BloomFilter ...
3 3 最长公共子序列 47 3 4 升序最长子序列 49 3 5 两位玩家游戏中的必胜策略 52 第 4 章 数组 53 4 1 合并已排序列表 53 4 2 区间的总和 54 4 3 区间内的重复内容 54 4 4 区间的最大总和 55 4 5 查询区间中的最小值...
最长公共前缀 15 三数之和 16 最接近的三数之和 20 有效的括号 21 合并两个有序链表 26 删除排序数组中的重复项 27 移除元素 28 实现strStr 32 最长有效括号 35 搜索插入位置 38 外观数列 41 缺失的第一个正数 53 最...