115.go 675 B

123456789101112131415161718192021222324252627282930
  1. package main
  2. func numDistinct(s string, t string) int {
  3. m, n := len(s), len(t)
  4. if m < n {
  5. return 0
  6. }
  7. dp := make([][]int, m+1) // dp[i, j] means num distinct between s[0...i-1] and t[0...j-1]
  8. for i := range dp {
  9. dp[i] = make([]int, n+1)
  10. dp[i][0] = 1
  11. }
  12. // if s[i-1] == t[i-1], dp[i, j] = dp[i-1, j-1] + dp[i-1, j]
  13. // else dp[i, j] = dp[i-1, j]
  14. for i := 1; i <= m; i++ {
  15. for j := 1; j <= n && j <= i; j++ {
  16. if s[i-1] == t[j-1] {
  17. dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
  18. } else {
  19. dp[i][j] = dp[i-1][j]
  20. }
  21. }
  22. }
  23. return dp[m][n]
  24. }
  25. // func main() {
  26. // println(numDistinct("rabbbit", "rabbit"), 3)
  27. // println(numDistinct("babgbag", "bag"), 5)
  28. // }