- 不同的子序列
思路
动态规划
dp[i][j]
表示S前i个
字符 中 T前j个
字符的个数。
则有如下递推公式
如果 s[i]==t[j] dp[i][j] = dp[i-1][j-1]+ dp[i-1][j]
,
否则 dp[i][j]=dp[i-1][j]
.
另外还有quickpath: 如果s
的长度比t
小一定为0. 所以可以快速返回
代码
func numDistinct(s string, t string) int {
if len(s) < len(t) {
return 0
}
s = "#" + s
t = "#" + t
dp := make([][]int, len(t))
for i := 0; i < len(t); i++ {
dp[i] = make([]int, len(s))
}
dp[0][0] = 1
for j := 0; j < len(s); j++ {
dp[0][j] = 1
}
for i := 1; i < len(t); i++ {
dp[i][0] = 1
if t[i] == s[i] {
dp[i][i] = dp[i-1][i-1]
}
for j := i + 1; j < len(s); j++ {
dp[i][j] = dp[i][j-1]
if t[i] == s[j] {
dp[i][j] += dp[i-1][j-1]
}
}
}
return dp[len(t)-1][len(s)-1]
}