/**
* Introduction to Algorithms, Second Edition
* 15.4 Longest common subsequence
* @author 土豆爸爸
*
*/
public class LongestCommonSubsequence {
/**
* 求两个字符串的最长公共子序列
* @param x 字符串x
* @param y 字符串y
* @return 两个字符串的最长公共子序列
*/
public static String lcs(String x, String y) {
int m = x.length();
int n = y.length();
int[][] c = new int[m + 1][n + 1]; //构建计算矩阵
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
if(x.charAt(i-1) == y.charAt(j-1)) { //如果相同右下
c[i][j] = c[i-1][j-1] + 1;
} else if(c[i-1][j] >= c[i][j-1]) { //向大的方向移动
c[i][j] = c[i-1][j];
} else {
c[i][j] = c[i][j-1];
}
}
}
return output(x, y, c, m, n).toString();
}
/**
* 迭代输出.
* @param x 字符串x
* @param y 字符串y
* @param c 计算矩阵
* @param i 行索引
* @param j 列索引
* @return 输出最长公共子序列
*/
private static StringBuilder output(String x, String y, int[][] c, int i, int j) {
if(i == 0 || j == 0) {
return new StringBuilder();
}
if(x.charAt(i-1) == y.charAt(j-1)) {
return output(x, y, c, i-1, j-1).append(x.charAt(i-1));
} else if (c[i][j] == c[i-1][j]) {
return output(x, y, c, i-1, j);
} else {
return output(x, y, c, i, j-1);
}
}
}
import junit.framework.TestCase;
public class LongestCommonSubsequenceTest extends TestCase {
public void testLcm() {
assertEquals("BCBA", LongestCommonSubsequence.lcs("ABCBDAB", "BDCABA"));
}
}
算法导论示例-LongestCommonSubsequence
最新推荐文章于 2025-11-08 15:00:00 发布
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
TensorFlow-v2.9
TensorFlow
TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型
581

被折叠的 条评论
为什么被折叠?



