题意要求我们找到S到T的所有可能的字串个数。 由于T是通过S消减字符形成,那么利用动态规划tmp{i][j]代表S的前i个字符到T的前j个字符可能的个数。 初始tmp[i][0]为1,即S到空串的转化只有一个途径,其余全为0。
当S[i-1]==T[j-1]时,要么保留S[i-1],要么舍弃;当不相同时,只能舍弃。
public class Solution {
public int numDistinct(String S, String T) {
if( S==null || T==null)
{
return 0;
}
int l1 = S.length();
int l2 = T.length();
if( l1 < l2 )
{
return 0;
}
int [][]tmp = new int[l1+1][l2+1];
tmp[0][0] =1;
for( int i=1;i<=l1;i++ )
{
tmp[i][0] = 1;
}
for( int i=1;i<=l1;i++ )
{
for( int j=1;j<=l2;j++ )
{
if(S.charAt(i-1)==T.charAt(j-1))
{
tmp[i][j] = tmp[i-1][j-1]+tmp[i-1][j];
}
else
{
tmp[i][j] = tmp[i-1][j];
}
}
}
return tmp[l1][l2];
}
}