找s中能包含t的字符组合。
当s[i]==t[i],则numDistinct(s,t) = numDistinct(s+1,t)+numDistinct(s+1,t+1),否则
numDistinct(s,t) = numDistinct(s+1,t)
用递归虽然超时,但逻辑其实更简单
public static int numDistinct(String s, String t) {
if(s.length()<t.length()||s.length()==0)return 0;
if(t.length()==0||s.equals(t))return 1;
if(s.charAt(0)==t.charAt(0)){
return numDistinct(s.substring(1),t.substring(1))+numDistinct(s.substring(1),t);
}
else return numDistinct(s.substring(1),t);
}
把递归改成动态规划数组,唯一不同一点的是按列从后往前遍历即可
public static int numDistinct(String s, String t) {
if(s.length()<t.length()||s.length()==0)return 0;
if(t.length()==0||s.equals(t))return 1;
int row = s.length();
int col = t.length();
int [][]dp = new int [row+1][col+1];
if(s.charAt(row-1)==t.charAt(col-1))dp[row][col]=1;
for(int j=row-1;j>0;j--){
if(s.charAt(j-1)==t.charAt(col-1)){
dp[j][col]=1+dp[j+1][col];
}
else
dp[j][col]=dp[j+1][col];
}
for(int i=col-1;i>0;i--){
for(int j=row-col+i;j>0;j--){
if(s.charAt(j-1)==t.charAt(i-1)){
dp[j][i] = dp[j+1][i+1]+dp[j+1][i];
}
else
dp[j][i] = dp[j+1][i];
}
}
return dp[1][1];
}