1143.M 最长公共子序列

Problem: 1143. 最长公共子序列arrow-up-right

思路

动态规划。

建立行列分别为len(text1)+1len(text2)+1dp矩阵(好处是简化边界值的处理) dp[i][j]表示text1的前i个字符和text2的前j个字符的最长公共子序列,有动态转移方程:

如果text1[i-1] == text2[j-1], 则dp[i][j] = dp[i-1][j-1] + 1
否则:dp[i][j] = max(dp[i-1][j], dp[i][j-1])

Code

func longestCommonSubsequence(text1 string, text2 string) int {
	m := len(text1)
	n := len(text2)
	if m == 0 || n == 0 {
		return 0
	}

	dp := make([][]int, m+1)
	for i := range dp {
		dp[i] = make([]int, n+1)
	}

	for i := 1; i <= m; i++ {
		for j := 1; j <= n; 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])
			}
		}
	}

	return dp[m][n]
}

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

	return b
}

Last updated