java实现动态规划最长公共子序列
时间: 2024-12-01 14:12:30 浏览: 3
Java动态规划求解最长公共子序列问题.zip
在Java中,动态规划是一种常见的算法技术,用于解决最优化问题,如计算两个序列的最长公共子序列(Longest Common Subsequence,LCS)。下面是使用动态规划求解最长公共子序列的一个基本步骤:
1. 定义状态:通常使用二维数组dp[i][j]来表示字符串s1的前i个字符和字符串s2的前j个字符的最长公共子序列长度。
2. 初始化边界条件:当其中一个字符串为空时,dp[i][j]就等于另一个字符串的长度;如果两个字符相等,dp[i][j]就是dp[i-1][j-1]+1;否则,dp[i][j]取max(dp[i-1][j], dp[i][j-1])。
3. 动态填充:遍历两个输入字符串,通过比较当前字符来更新dp值。对于不相等的字符,选择不包含它们的最大子序列长度。
4. 返回结果:当遍历完成后,dp[m][n]就是最长公共子序列的长度,其中m和n分别是两个字符串的长度。为了获取实际的子序列,可以回溯从dp[m][n]开始,根据原始字符串构建最长公共子序列。
以下是简单的Java代码实现:
```java
public class LCS {
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 = 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]);
}
}
}
StringBuilder sb = new StringBuilder();
int i = m, j = n;
while (i > 0 && j > 0) {
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
sb.append(s1.charAt(i - 1));
i--;
j--;
} else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
} else {
j--;
}
}
return sb.reverse().toString(); // 反转以得到正确的顺序
}
}
```
阅读全文