动态规划法实现最长公共子序列java
时间: 2023-11-25 13:48:18 浏览: 104
动态规划法是一种常用的求解最长公共子序列问题的算法。其基本思想是将原问题分解为若干个子问题,通过求解子问题的最优解来得到原问题的最优解。在Java中,可以通过以下步骤实现最长公共子序列的求解:
1. 定义一个二维数组dp,其中dp[i][j]表示字符串s1的前i个字符和字符串s2的前j个字符的最长公共子序列的长度。
2. 初始化dp数组,将dp[j]和dp[i]均设为0。
3. 遍历字符串s1和s2,如果s1[i-1]等于s2[j-1],则dp[i][j] = dp[i-1][j-1] + 1;否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
4. 最终dp[m][n]即为最长公共子序列的长度。
除了最长公共子序列,动态规划法也可以用来求解最长公共子字符串。具体实现方法与最长公共子序列类似,只需要将dp[i][j]表示为以s1[i-1]和s2[j-1]结尾的最长公共子字符串的长度即可。
相关问题
java语言动态规划算法求最长公共子序列
面是Java语言动态规划算法求最长公共子序列的代码实现:
```java
public static int longestCommonSubsequence(String text1, String text2) {
char[] charsA = text1.toCharArray();
char[] charsB = text2.toCharArray();
int n = charsA.length;
int m = charsB.length;
int[][] dp = new int[n][m];
dp[n-1][m-1] = charsA[n-1]==charsB[m-1]?1:0;
for (int i = n-2; i >= 0; i--) {
dp[i][m-1] = charsA[i] == charsB[m-1]?1:dp[i+1][m-1];
}
for (int j = m-2; j >= 0; j--) {
dp[n-1][j] = charsA[n-1] == charsB[j]?1:dp[n-1][j+1];
}
for (int i = n-2; i >= 0; i--) {
for (int j = m-2; j >= 0; j--) {
int p1 = dp[i][j+1];
int p2 = dp[i+1][j];
int p3 = charsA[i]==charsB[j]?(1+dp[i+1][j+1]):0;
dp[i][j] = Math.max(p1,Math.max(p2,p3));
}
}
return dp[0][0];
}
```
该算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些问题的解得到原问题的解。与分治法不同的是,适合动态规划求解的问题,经分解得到的子问题往往不是相互独立的。
java动态规划法寻找所有的最长公共子序列
动态规划是一种常用的解决问题的算法思想,可以应用于多种问题,包括寻找最长公共子序列。在Java中,可以使用动态规划算法来寻找所有的最长公共子序列。
首先,我们需要定义一个二维数组dp[][]来保存计算结果。其中dp[i][j]表示字符串s1的前i个字符和字符串s2的前j个字符的最长公共子序列的长度。
接下来,我们使用一个双重循环来遍历s1和s2的所有字符,逐个计算dp[i][j]的值。具体的计算方法如下:
1. 如果s1的第i个字符和s2的第j个字符相等,则dp[i][j] = dp[i-1][j-1] + 1。即最长公共子序列的长度加1。
2. 如果s1的第i个字符和s2的第j个字符不相等,则dp[i][j] = max(dp[i-1][j], dp[i][j-1])。取左边和上边的最大值作为最长公共子序列的长度。
计算完成后,我们可以通过逆向追溯dp数组,从右下角开始,根据当前位置的值和相邻位置的值进行判断,确定最长公共子序列的具体内容。
最后,我们可以将所有的最长公共子序列存储在一个集合中,并输出结果。
总结来说,Java动态规划法寻找所有的最长公共子序列的具体步骤包括定义dp数组来保存计算结果,计算dp[i][j]的值,逆向追溯dp数组,确定最长公共子序列的内容,并将结果存储并输出。
阅读全文