不同的子序列——动态规划

86 阅读1分钟

image.png

动态规划代码:

  1. dp[i][j] 表示 s[:i] 子序列中 t[:j] 出现了几次
  2. 当前字符不同,那么状态转移 dp[i][j] = dp[i-1][j]
  3. 相同则 dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
func numDistinct(s, t string) int {
    a, b := len(s), len(t)
    if a < b {
        return 0
    }
    dp := make([][]int, a+1)
    for i := range dp {
        dp[i] = make([]int, b+1)
        dp[i][0] = 1
    }
    for i := 1; i <= a; i++ {
        for j := 1; j <= b; 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[a][b]
}