java最长公共子序列的代码实现
时间: 2023-11-21 22:54:17 浏览: 70
下面是Java实现最长公共子序列的代码:
```java
public class LCS {
public static int lcs(String X, String Y, int m, int n) {
int[][] L = new int[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
L[i][j] = 0; } else if (X.charAt(i - 1) == Y.charAt(j - 1)) {
L[i][j] = L[i - 1][j - 1] + 1;
} else {
L[i][j] = Math.max(L[i - 1][j], L[i][j - 1]);
}
}
}
return L[m][n];
}
}
```
其中,X和Y分别为两个字符串,m和n分别为它们的长度。函数lcs返回X和Y的最长公共子序列的长度。
相关问题
最长公共子序列Java代码
下面是用 Java 实现的最长公共子序列代码,同样假设两个字符串为 s1 和 s2:
```java
public int longestCommonSubsequence(String s1, String s2) {
int m = s1.length(), n = s2.length();
int[][] dp = new int[m + 1][n + 1];
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n];
}
```
这里同样使用二维数组 dp 来记录子问题的最优解,初始化 dp[0][0] 为0。注意字符串的下标从0开始,所以在 dp 中的下标也要减1。最后返回 dp[m][n],即 s1 和 s2 的最长公共子序列长度。
java实现最长公共子序列算法
最长公共子序列(Longest Common Subsequence, LCS)是指给定两个序列X和Y,找出它们的最长公共子序列。
以下是Java实现最长公共子序列算法的代码:
```java
public static int lcs(String X, String Y) {
int m = X.length();
int n = Y.length();
int[][] L = new int[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
L[i][j] = 0;
} else if (X.charAt(i - 1) == Y.charAt(j - 1)) {
L[i][j] = L[i - 1][j - 1] + 1;
} else {
L[i][j] = Math.max(L[i - 1][j], L[i][j - 1]);
}
}
}
return L[m][n];
}
```
代码中的L数组是用来记录最长公共子序列的长度的,其中L[i][j]表示X的前i个字符和Y的前j个字符的最长公共子序列的长度。算法的时间复杂度为O(mn)。
阅读全文