描述
该题来自于力扣第115题
分析
这种问题应该首先想到动态规划是否可以解决,以dp[i][j]
表示s[:i]
的子序列中t[:j]
出现的个数,然后看看转移方程是什么?
当s[i-1] = t[j-1]
时,有两种情况:1.
不算上s[i-1]
,即s[:i-1]
的子序列中t[:j]
出现的个数dp[i-1][j]
;2.
算上s[i-1]
,即s[:i-1]
中的子序列中t[:j-1]
出现的个数dp[i-1][j-1]
;两种情况相加。
否则就是s[:i-1]
的子序列中t[:j]
出现的个数dp[i-1][j]
。
所以转移方程为
\[
dp[i][j] = \left\{
\begin{aligned}
& dp[i-1][j] + dp[i-1][j-1] & s[i-1]=t[j-1]\\
& dp[i-1][j] & others
\end{aligned}
\right.
\]
可以看到dp[i][?]
只与dp[i-1][?]
状态有关,从而可以状态压缩,使用一维数组表示,所以
1
dp[k] = dp[k] + dp[k-1] * (s[i-1] == t[j-1]) ? 1 : 0
又由于dp[k]
需要使用dp[k-1]
的状态,所以k
从后面开始更新,而初始状态dp[0]=1
,其他设为0
。
代码
1 | class Solution: |