📜  门| GATE-CS-2005 |第 84 题(1)

📅  最后修改于: 2023-12-03 15:28:42.513000             🧑  作者: Mango

题目介绍

该题目是GATE-CS-2005的第 84 题,是一道典型的动态规划问题。题目要求我们利用动态规划求解最长公共子序列(Longest Common Subsequence)并返回其长度。

解题思路

动态规划是解决最长公共子序列问题的一种有效方法。该问题可以用一个二维数组dp(i, j)表示字符串X的前i个字符和字符串Y的前j个字符的最长公共子序列。则dp(i, j)的值可以根据(i-1, j)、(i, j-1)和(i-1, j-1)的值推算出来。

若字符串X的第i个字符和字符串Y的第j个字符不相等,则dp(i, j)的值等于max(dp(i-1, j), dp(i, j-1))。

如果字符串X的第i个字符和字符串Y的第j个字符相等,则dp(i, j)的值等于dp(i-1, j-1) + 1。

最终结果也就是dp(length(X), length(Y))。具体实现过程如下:

int longestCommonSubsequence(String X, String Y) {
    int m = X.length(), n = Y.length();
    int[][] dp = new int[m + 1][n + 1];
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (X.charAt(i - 1) == Y.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(length(X), length(Y))。