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. 最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章

1143.最长公共子序列

1143.最长公共子序列

动态规划1143. 最长公共子序列

java刷题--1143最长公共子序列

LeetCode1143. 最长公共子序列/300. 最长递增子序列//1713. 得到子序列的最少操作次数(好题!!!!!)

LeetCode 1143 最长公共子序列