【力扣 中等 C】1143. 最长公共子序列

目录

题目

解法一:动态规划


题目

待添加

解法一

cpp 复制代码
int max(int a, int b) {
    return a > b ? a : b;
}

int longestCommonSubsequence(char* text1, char* text2) {
    const int len1 = strlen(text1), len2 = strlen(text2);

    // 将长度较小的字符串作为text2,节省dp数组的空间
    if (len1 < len2) {
        return longestCommonSubsequence(text2, text1);
    }

    int dp[len2 + 1];
    memset(dp, 0, sizeof(dp));
    
    // 当前位置与左边、上边和左上位置有关
    for (int i = 1; i <= len1; i++) {
        int leftUp = dp[0];
        for (int j = 1; j <= len2; j++) {
            int backup = dp[j];
            if (text1[i - 1] == text2[j - 1]) {
                dp[j] = leftUp + 1;
            } else {
                dp[j] = max(dp[j - 1], dp[j]);
            }
            leftUp = backup;
        }
    }
    return dp[len2];
}