LeetCode 1143. Longest Common Subsequence 题解
LeetCode 1143. Longest Common Subsequence 题解题目描述给定两个字符串text1和text2返回这两个字符串的最长公共子序列的长度。子序列是指这样一个新的字符串它是由原字符串在不改变字符的相对顺序的情况下删除某些字符也可以不删除任何字符后组成的新字符串。示例 1输入text1 abcde, text2 ace 输出3 解释最长公共子序列是 ace它的长度为 3。示例 2输入text1 abc, text2 abc 输出3 解释最长公共子序列是 abc它的长度为 3。示例 3输入text1 abc, text2 def 输出0 解释两个字符串没有公共子序列返回 0。解题思路方法动态规划思路定义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])初始化dp[i][0] 0因为空字符串与任何字符串的最长公共子序列长度为 0dp[0][j] 0同理复杂度分析时间复杂度O(m × n)其中 m 和 n 是两个字符串的长度。需要填充一个 m1 × n1 的表格。空间复杂度O(m × n)需要一个 m1 × n1 的表格来存储状态。代码实现方法动态规划class Solution: def longestCommonSubsequence(self, text1: str, text2: str) - int: m len(text1) n len(text2) # 初始化 dp 表格 dp [[0] * (n 1) for _ in range(m 1)] # 填充 dp 表格 for i in range(1, m 1): for j in range(1, n 1): 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]测试用例测试用例 1输入text1 abcde, text2 ace输出3测试用例 2输入text1 abc, text2 abc输出3测试用例 3输入text1 abc, text2 def输出0测试用例 4输入text1 bl, text2 yby输出1总结本题是动态规划的经典问题主要考察对状态定义和状态转移方程的理解。通过动态规划我们可以高效地计算出两个字符串的最长公共子序列的长度。动态规划的核心思想是通过填充一个二维表格记录text1的前i个字符和text2的前j个字符的最长公共子序列的长度。根据当前字符是否匹配选择不同的状态转移策略。这种方法不仅适用于最长公共子序列问题还可以应用于许多其他需要比较两个序列的问题例如编辑距离、最长回文子串等。掌握动态规划的思想对于解决这类问题非常重要。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2476975.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!