mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-04 16:12:47 +08:00
46 lines
756 B
Go
46 lines
756 B
Go
package leetcode
|
|
|
|
// 解法一 压缩版 DP
|
|
func numDistinct(s string, t string) int {
|
|
dp := make([]int, len(s)+1)
|
|
for i, curT := range t {
|
|
pre := 0
|
|
for j, curS := range s {
|
|
if i == 0 {
|
|
pre = 1
|
|
}
|
|
newDP := dp[j+1]
|
|
if curT == curS {
|
|
dp[j+1] = dp[j] + pre
|
|
} else {
|
|
dp[j+1] = dp[j]
|
|
}
|
|
pre = newDP
|
|
}
|
|
}
|
|
return dp[len(s)]
|
|
}
|
|
|
|
// 解法二 普通 DP
|
|
func numDistinct1(s, t string) int {
|
|
m, n := len(s), len(t)
|
|
if m < n {
|
|
return 0
|
|
}
|
|
dp := make([][]int, m+1)
|
|
for i := range dp {
|
|
dp[i] = make([]int, n+1)
|
|
dp[i][n] = 1
|
|
}
|
|
for i := m - 1; i >= 0; i-- {
|
|
for j := n - 1; j >= 0; j-- {
|
|
if s[i] == t[j] {
|
|
dp[i][j] = dp[i+1][j+1] + dp[i+1][j]
|
|
} else {
|
|
dp[i][j] = dp[i+1][j]
|
|
}
|
|
}
|
|
}
|
|
return dp[0][0]
|
|
}
|