|
@@ -1,10 +1,30 @@
|
|
|
package main
|
|
|
|
|
|
func numDistinct(s string, t string) int {
|
|
|
- return 0
|
|
|
+ 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)
|
|
|
-}
|
|
|
+// func main() {
|
|
|
+// println(numDistinct("rabbbit", "rabbit"), 3)
|
|
|
+// println(numDistinct("babgbag", "bag"), 5)
|
|
|
+// }
|