首页 > 其他 > 详细

LeetCode115不同的子序列

时间:2019-07-03 22:39:30      阅读:80      评论:0      收藏:0      [点我收藏+]

 

题目说明在这里就不贴出来了,相信打开这篇文章的小伙伴们肯定都是在刷LeetCode的。

一开始我的想法是dfs+回溯,结果运行超时,一开始我就觉得可能会超时,结果不出所料【手动笑哭】。

后来我想了下dfs在每一次都需要遍历,这样时间复杂度当然高啊。

后来经过了不知道多久的好久,我就学会了使用动态规划的方法,哎,动态规划一直是我的弱点所在,逻辑思维能力跟不上!

动态规划的重点在于找到状态转换方程,说是这样说的,但是我每次都找不到转换方程啊。。。。哈哈哈哈,无奈大笑!技术分享图片

 

废话不多,直接上图,一图胜千言!

技术分享图片

解释上图:各位小伙伴可以发现蓝色一行全为1,啥意思尼?因为我们设置dp[t.length+1][s.length+1],多一行

和多一列的目的是我们需要dp【0】【0】的那个初始值1,因为当 为空 为空时匹配情况为1,然后当 为空随

着 不断变长其匹配数仍为1。黄色一列同理可得当 为空 不空时没有可以匹配的。

然后我们通过观察可以猜出

if(t【i-1】== s【j-1】)dp【i】【j】 = dp【i-1】【j-1】+ dp【i】【j-1】

else dp【i】【j】 = dp【i】【j-1】

else后面的很好理解,例如当 t 取前面一个字符 “r” 然后依次从前往后去s中找匹配,当 s = “r”时匹配为1, 当 s = “ra”

时匹配仍为1,依次类推。

然而,if后面的那个表达式又是什么意思呢?

技术分享图片

如图,这个例子可以很好的解释,现在要求最后一个方框中的值,dp【i】【j】 = dp【i-1】【j-1】+ dp【i】【j-1】

在这里的解释就是:在a之前b的个数,有多少个b就可以与a组成多少对匹配,

然后加上当s = “ba” s = “babagc” 时,能够匹配的ba的数量 

 

LeetCode115不同的子序列

原文:https://www.cnblogs.com/jiguang321/p/11129304.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!