java实现最长公共子序列算法
时间: 2023-10-12 13:19:38 浏览: 185
最长公共子序列(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)。
相关问题
使用java实现最长公共子序列动态规划算法的代码
好的,以下是使用Java实现最长公共子序列动态规划算法的代码:
```java
public class LCS {
public static int lcs(String s1, String s2) {
int m = s1.length();
int 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];
}
public static void main(String[] args) {
String s1 = "ABCD";
String s2 = "ACDF";
System.out.println(lcs(s1, s2));
}
}
```
用Java实现最长公共子序列
最长公共子序列问题是算法中一个经典的问题,通常可以使用动态规划算法来解决。下面是使用Java实现最长公共子序列的代码:
```java
public class LongestCommonSubsequence {
public static void main(String[] args) {
String str1 = "ABCDGHLQR";
String str2 = "AEDPHR";
int m = str1.length();
int n = str2.length();
System.out.println("Length of Longest Common Subsequence is " + lcs(str1, str2, m, n));
}
public static int lcs(String str1, String str2, int m, int n) {
int[][] lcsArray = 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) {
lcsArray[i][j] = 0;
} else if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
lcsArray[i][j] = 1 + lcsArray[i - 1][j - 1];
} else {
lcsArray[i][j] = Math.max(lcsArray[i - 1][j], lcsArray[i][j - 1]);
}
}
}
return lcsArray[m][n];
}
}
```
此代码中,我们首先定义了两个字符串变量 str1 和 str2,以及它们的长度 m 和 n。然后我们创建了一个二维数组lcsArray,用于存储计算过程中的中间值。
接下来,我们使用两层循环遍历str1和str2,并在每个位置上计算最长公共子序列的长度。如果str1和str2在当前位置上的字符相同,我们将lcsArray[i][j]设为1加上左上角位置的值;否则,我们将lcsArray[i][j]设置为上方或左方的值中的最大值。
最后,我们返回lcsArray[m][n],即最长公共子序列的长度。
阅读全文