本文摘自网络,作者,侵删。
- 不同的子序列
思路
动态规划
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]
}
本文来自:简书
感谢作者:lucasgao
查看原文:leetcode 115. 不同的子序列 golang
相关阅读 >>
再见Go-micro!企业项目迁移Go-zero全攻略(一)
手撸Golang 基本数据结构与算法 图的最短路径 狄克斯特拉算法
更多相关阅读请进入《Go》频道 >>
Go语言101
一个与时俱进的Go编程知识库。