package main
func numDistinct(s string, t string) int {
m, n := len(s), len(t)
if m < n {
return 0
}
dp := make([][]int, m+1) // dp[i, j] means num distinct between s[0...i-1] and t[0...j-1]
for i := range dp {
dp[i] = make([]int, n+1)
dp[i][0] = 1
}
// if s[i-1] == t[i-1], dp[i, j] = dp[i-1, j-1] + dp[i-1, j]
// else dp[i, j] = dp[i-1, j]
for i := 1; i <= m; i++ {
for j := 1; j <= n && j <= i; j++ {
if s[i-1] == t[j-1] {
dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
} else {
dp[i][j] = dp[i-1][j]
}
}
}
return dp[m][n]
}
// func main() {
// println(numDistinct("rabbbit", "rabbit"), 3)
// println(numDistinct("babgbag", "bag"), 5)
// }