LeetCode 1143. 最长公共子序列

LeetCode 1143. 最长公共子序列

1. 问题描述

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
LeetCode 1143. 最长公共子序列_第1张图片

2. 思路

最长公共子序列问题是典型的二维动态规划问题。
LeetCode 1143. 最长公共子序列_第2张图片

LeetCode 1143. 最长公共子序列_第3张图片

3. 代码

func longestCommonSubsequence(text1 string, text2 string) int {
    m, n := len(text1), len(text2)

    dp := make([][]int, m + 1)
    for i := 0; i < len(dp); i++ {
        dp[i] = make([]int, n + 1)
    }

    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            if text1[i] == text2[j] {
                dp[i+1][j+1] = dp[i][j] + 1
            } else {
                dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])
            }
        }
    }
    return dp[m][n]
}

func max(a, b int) int {
    if a < b {
        a = b
    }
    return a
}

你可能感兴趣的:(leetcode刷题,leetcode,动态规划)