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
.
Still two-dimensional dp problem.
path[i][j] indicates the number of occurrences that T(i) appears in S(j)
1. T(i) == S(j) path[i][j]= path[i-1][j-1] + path[i][j-1]
sum up the # of occurrences that T(i-1) in S(j-1) and T(i) in S(j-1)
2. T(i) != S(j) path[i][j] = path[i][j-1]
这里,我把substring T作为二维数组的row,而S作为列,如果顺序互换一下的话,记得i和j的操作也要相应改一下
public int numDistinct(String S, String T) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(S==null || T==null)
return 0;
int[][] path = new int[T.length()+1][S.length()+1];
for(int j=0;j<path[0].length;j++)
path[0][j]=1;
for(int i=1;i<=T.length();i++){
for(int j=1;j<=S.length();j++){
if(T.charAt(i-1)==S.charAt(j-1)){
path[i][j]=path[i-1][j-1]+path[i][j-1];
}
else
path[i][j]=path[i][j-1];
}
}
return path[T.length()][S.length()];
}