Leetcode 1143. Longest Common Subsequence (python+cpp)

Leetcode 1143. Longest Common Subsequence

题目

在这里插入图片描述

解析:

前面碰到过很多道跟这种sequence相关的题目了,在这题里分析分析这种题目本质上应该怎么考虑。在前面碰到的题目里比如300 longest increasing subsequence139 wordbreak,这些题目都是用动态规划来解非常经典的题目,但是如果你看过我前两道题的解析,会发现我在这些解法前面都加了一种recursion的方法,也可以理解为是brutal force,但这些解法毫无疑问都是超时的。
那么为什么要放这些解法呢,因为其实动态规划都是在brutal force解法上演变过来的。借着这道题来讲讲他是怎么演变的。
首先我们来看看brutal force应该怎么解这道题,brutal force其实是从两个string的末尾开始往前倒推recursion来解决的。现在我们定义一个recursion函数叫LSC(text1,text2).从末尾开始考虑,逻辑应该是这样:

if text1[curr_pos]==text2[curr_pos]:
	LCS(text1,text2) = 1 + LCS(text1[:-1],text2[:-1])
else:
	LCS(text1,text2) = max(LCS(text1[:-1],text2),LCS(text1,text2[:-1]))

总体的recursion逻辑就是这样。但是这样的时间复杂度会是O(2^L).但是看上面的逻辑判断,会有一种感觉就是怎么跟动态规划的状态转移方程这么像呢。其实这道题的动态规划解法就是基于这种recursion的思想。
我们定义一个二维dp数组,形状为(m+1,n+1),m,n代表text1和text2的长度,状态转移方程为:

if text1[i-1]==text2[j-1]:
	dp[i][j] = 1 + dp[i-1][j-1]
else:
	dp[i][j] = max(dp[i-1][j],dp[i][j-1])

两种方法对比我们就可以发现,其实本质上:

dp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值