|  | @@ -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)
 | 
	
		
			
				|  |  | +// }
 |