动态规划在字符串比对中的应用

Posted 教你写算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划在字符串比对中的应用相关的知识,希望对你有一定的参考价值。

今天的题目是这样的,说给了两个字符串s和t,求解s的subsequence到底有几种可以构成t的方法。

例如s = rabbbit, t = rabbit。这里就是三种

s = babgbag, t = bag。这里是五种。


常规解法:

首先需要一个指针b指向t的首字母,然后在s里面找到b指针所指的字母,移动b指针,依次类推。这种方法很好理解,但是实现起来很麻烦,时间复杂度达到了O(m²n)。


Dynamic Programming:

我们拿第二个例子进行举例说明。

首先当s = b,t = b的时候,很明显答案是1。扩大一下s,s = ba,t = b的时候,答案还是1。于是我们可以得到下面这个表格

接下来,我们继续扩大s。

动态规划在字符串比对中的应用

然后我们扩大t。

动态规划在字符串比对中的应用

最后我们可以写出整个的表格为:

这里我要解释一下表格的第二排和第二列。如果当s和t均为空的时候很明显答案是1。如果当s为空,t为非空的时候,很明显答案是0。如果当t为空s非空的时候答案很明显也是1。

通过观察表格,我们可以发现,当s[j] = t[i]的时候,table[i][j] = table[i-1][j-1] + table[i][j-1]。当s[j] != t[i]的时候,table[i][j] = table[i][j-1]。

不等的情况很好理解就不做概述了。等于的情况我在这里解释一下,我们已知“bab”里面含有两个b,含有一个ba,然后我要在后面加上一个a问含有几个ba。因为已经含有两个b了所以答案是原来的1个ba再加上新出现2个ba,答案是3。

理解了通项公式,代码就不难写出了。

时间复杂度和空间复杂度均为O(mn)。


以上是关于动态规划在字符串比对中的应用的主要内容,如果未能解决你的问题,请参考以下文章

动态规划和双序列比对

序列比对-动态规划算法

动态规划算法入门练习 (python实现)

算法 LC 动态规划 - 最大递增子序列

一招解决4道leetcode hard题,动态规划在字符串匹配问题中的应用

五大经典算法-动态规划 及其算法应用