用java实现最长公共子序列问题
时间: 2023-09-09 19:10:46 浏览: 92
最长公共子序列问题是指,给定两个字符串S1和S2,求它们的最长公共子序列LCS。
Java实现最长公共子序列问题可以使用动态规划算法,具体实现步骤如下:
1. 定义一个二维数组dp,其中dp[i][j]表示S1的前i个字符和S2的前j个字符的最长公共子序列的长度。
2. 初始化dp数组的第一行和第一列,即dp[0][j]和dp[i][0]都为0。
3. 对于任意的i>0和j>0,若S1的第i个字符等于S2的第j个字符,则dp[i][j] = dp[i-1][j-1] + 1;否则dp[i][j] = max(dp[i][j-1], dp[i-1][j])。
4. 最终,dp[S1.length()][S2.length()]的值即为S1和S2的最长公共子序列的长度。
下面是Java代码实现:
```
public static String LCS(String S1, String S2) {
int m = S1.length();
int n = S2.length();
int[][] dp = new int[m+1][n+1];
for (int i = 0; i <= m; i++) {
dp[i][0] = 0;
}
for (int j = 0; j <= n; j++) {
dp[0][j] = 0;
}
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][j-1], dp[i-1][j]);
}
}
}
int len = dp[m][n];
char[] lcs = new char[len];
int i = m, j = n;
while (i > 0 && j > 0) {
if (S1.charAt(i-1) == S2.charAt(j-1)) {
lcs[--len] = S1.charAt(i-1);
i--;
j--;
} else if (dp[i][j-1] > dp[i-1][j]) {
j--;
} else {
i--;
}
}
return new String(lcs);
}
```
调用LCS方法即可返回S1和S2的最长公共子序列。
阅读全文