- 动态规划
- 创建二维 d p dp dp 数组, d p [ i ] [ j ] dp[i][j] dp[i][j] 表示 t [ 0 : j − 1 ] t[0:j-1] t[0:j−1] 在 s [ 0 : i − 1 ] s[0:i-1] s[0:i−1] 中出现的次数
- 状态转移
- 边界条件: d p [ i ] [ 0 ] = 1 , d p [ 0 ] [ j ] = 0 dp[i][0]=1,dp[0][j]=0 dp[i][0]=1,dp[0][j]=0
- 若
s
[
i
−
1
]
=
=
t
[
j
−
1
]
s[i-1] == t[j-1]
s[i−1]==t[j−1],
s
[
i
−
1
]
s[i-1]
s[i−1] 可以选择自己是否跟
t
[
j
−
1
]
t[j-1]
t[j−1] 匹配
-
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 由两部分组成:
- 如果匹配,那么 dp[i][j] 其中一部分数量就是 dp[i-1][j-1]
- 如果选择不匹配(这样可以让前面的字符跟 t [ j − 1 ] t[j-1] t[j−1] 匹配), d p [ i ] [ j ] dp[i][j] dp[i][j] 另外一部分就是 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i−1][j]
-
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 由两部分组成:
- 若 s [ i − 1 ] ! = t [ j − 1 ] s[i-1] != t[j-1] s[i−1]!=t[j−1], d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i−1][j]