力扣_字符串8—不同的子序列-方法

时间:2024-02-15 17:10:36
  • 动态规划
    • 创建二维 d p dp dp 数组, d p [ i ] [ j ] dp[i][j] dp[i][j] 表示 t [ 0 : j − 1 ] t[0:j-1] t[0:j1] s [ 0 : i − 1 ] s[0:i-1] s[0:i1] 中出现的次数
    • 状态转移
      • 边界条件: d p [ i ] [ 0 ] = 1 , d p [ 0 ] [ j ] = 0 dp[i][0]=1,dp[0][j]=0 dp[i][0]=1,dp[0][j]=0
      • s [ i − 1 ] = = t [ j − 1 ] s[i-1] == t[j-1] s[i1]==t[j1] s [ i − 1 ] s[i-1] s[i1] 可以选择自己是否跟 t [ j − 1 ] t[j-1] t[j1] 匹配
        • d p [ i ] [ j ] dp[i][j] dp[i][j] 由两部分组成:
          • 如果匹配,那么 dp[i][j] 其中一部分数量就是 dp[i-1][j-1]
          • 如果选择不匹配(这样可以让前面的字符跟 t [ j − 1 ] t[j-1] t[j1] 匹配), d p [ i ] [ j ] dp[i][j] dp[i][j] 另外一部分就是 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j]
      • s [ i − 1 ] ! = t [ j − 1 ] s[i-1] != t[j-1] s[i1]!=t[j1] d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i1][j]