代码随想录算法训练营第五十三天 | 1143. 最长公共子序列、1035. 不相交的线

1143. 最长公共子序列

视频讲解

主要思路:

这题与昨天最长重复子序列关键区别就在于昨天子序列要求是连续的,而今天这题子序列可以间断,所以在递推公式时当text1与text2对应位置元素相等时自然dp[i][j]递增1,而当不等时则考虑dp[i - 1][j]或者dp[i][j - 1]中较大的一个,因为不要忘了dp[i][j]的含义就是text1里以i - 1,text2里以 j - 1为结尾的最长公共子序列

代码实现:

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int row = text1.size() + 1;
        int col = text2.size() + 1;
        vector> dp(row, vector(col, 0));
        int ret = 0;
        for(int i = 1; i < row; i++) {
            for(int j = 1; j < col; j++) {
                if(text1[i - 1] == text2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
                if(dp[i][j] > ret) {
                    ret = dp[i][j];
                }
            }
        }
        return ret;
    }
};

1035. 不相交的线

主要思路:

这题本质其实与上题一样,因为该题要求就是在两个字符串中找相同数字,相同数字可以不连续,但相对位置不能变,那就是最长公共子序列问题

代码实现:

class Solution {
public:
    int maxUncrossedLines(vector& nums1, vector& nums2) {
        int row = nums1.size() + 1;
        int col = nums2.size() + 1;
        vector> dp(row, vector(col, 0));
        int ret = 0;
        for(int i = 1; i < row; i++) {
            for(int j = 1; j < col; j++) {
                if(nums1[i - 1] == nums2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
                if(dp[i][j] > ret) {
                    ret = dp[i][j];
                }
            }
        }
        return ret;
    }
};

你可能感兴趣的:(算法训练营,算法,动态规划)