Distinct Subsequences

来源:互联网 发布:求推荐淘宝耐克正品店 编辑:程序博客网 时间:2024/05/18 00:24

Given a string S and a string T, count the number of distinct subsequences of T in S.

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE" is a subsequence of "ABCDE" while "AEC" is not).

Here is an example:
S = "rabbbit"T = "rabbit"

Return 3.

思路: 法1, 利用递归来做, 每有一个相同的,T 向后移动一位
法2, 用DP 来解决。 dp[i][j] 为 从S[0..j-1]中删除某些字符后得 T[0...i-1]的不同删除方法数量。
 if(S.charAt(i - 1) == T.charAt(j - 1)){
                    dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];//如果这一位相同,删除 第i 位的匹配数 加上 前面i,  j 已经匹配上的。 则这位需要 S前i - 1位 和 T 前 j-1 匹配的结果  加上 S 前i - 1 位和 T 的前j 位匹配的结果之和。
                }else{
                    dp[i][j] = dp[i - 1][j];// 因为这位没匹配上,说明这次删除的是S 的第i 位。 但是 S 前 i - 1 位已经和T 的前 j 位匹配了的结果就和这个结果是一样的。

                }

正确理解,  dp[i][j] = dp[i- 1][j] , 因为i 位的不同,  除去这一位包含的情况和含有这一位包含的情况相同 。
如果 i  和 j 位的相同, 则 dp[i][j]  等于 S 的 前 i - 1 位 和 T 前 j 位的匹配 dp[i - 1][j]  加上  i  j  全在的情况  dp[i - 1][j - 1]
易错点: dp[i][0] 别忘记初始化。 别忘了 dp[i][j] = dp[i - 1][j] 向上转移

  public int numDistinct(String S, String T) {    // Start typing your Java solution below    // DO NOT write main() function    if (S.length() == 0) {      return T.length() == 0 ? 1 : 0;    }    if (T.length() == 0) {      return 1;    }    int cnt = 0;    for (int i = 0; i < S.length(); i++) {      if (S.charAt(i) == T.charAt(0)) {        cnt += numDistinct(S.substring(i + 1), T.substring(1));      }    }    return cnt;  }

public class Solution {    public int numDistinct(String S, String T) {        int m = S.length();        int n = T.length();        if(m == 0){            return n == 0 ? 1 : 0;        }        int[][] dp = new int[m + 1][n + 1];        for(int i = 0; i <= m; i++){            dp[i][0] = 1;        }        for(int i = 1; i <= m; i++){            for(int j = 1; j <=n; j++){                if(S.charAt(i - 1) == T.charAt(j - 1)){                    dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];                }else{                    dp[i][j] = dp[i - 1][j];                }            }        }        return dp[m][n];    }}



0 0