1143. 最长公共子序列
Posted 心脏dance
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1143. 最长公共子序列相关的知识,希望对你有一定的参考价值。
题目链接:力扣
思路:动态规划入门题
先上递推式: dp[i][j] 表示 text1 前 i 个字符和 text2 的前 j 个字符的最长公共子序列 递推式怎么来的呢?
给定两个字符串 S1 , S2,设序列 S1 = x1, x2, x3 ... xn , S2 = y1, y2, y3 ... ym , 的最长公共子序列是 S = z1, z2, z3 ... zk 。
1. 如果 xn = ym , 则 zk = xn = ym , 那么 S[k - 1] 就是 S1[n - 1] 和 S2[m - 1] 的 最长公共子序列
2. 如果 xn != ym , 且zk != xn , 那么 S[k] 就是 S1[n - 1] 和 S2[m] 的 最长公共子序列
3. 如果 xn != ym , 且 zk != ym , 那么 S[k] 就是 S1[n] 和 S2[m - 1] 的 最长公共子序列
所以我们很容易就得到递推式了
上代码(注意dp的初始化的值,都是0(不知道为啥的可以在下面评论哦~~~)):
import kotlin.math.max
class Solution
fun longestCommonSubsequence(text1: String, text2: String): Int
val dp = Array(text1.length + 1) IntArray(text2.length + 1)
for (i in 1..text1.length)
for (j in 1..text2.length)
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[text1.length][text2.length]
以上是关于1143. 最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode1143. 最长公共子序列/300. 最长递增子序列//1713. 得到子序列的最少操作次数(好题!!!!!)