首先看到子串的问题,我们都很容易想到创造出dp[s1.length()][s2.length()]的动态数组,下面我们看题:
我想到,正常的遍历时候,如果我们设个标记,标记一下我们之前遇到过的情况会不会更容易一些,比如,我们遇到第一个b的时候,我们心想,如果前面的字符有两种情况,我们判断如果现在的字符和预想中的匹配成功,那么我们需要把前面的字符情况+此字符产生的情况,也就是dp[i][j]=dp[i-1][j-1]+dp[i][j-1],如果匹配不成功呢,那么我们只记录一下此字符产生的情况,不用考虑前面的字符,也就是dp[i][j]=dp[i][j-1]。那么状态转换方程我们找到了,列出代码:
public int numDistinct(String s, String t) {
int[][] dp=new int[t.length()+1][s.length()+1];
for(int i=0;i<t.length()+1;i++){
for(int j=0;j<s.length()+1;j++){
if(i==0) {
dp[i][j]=1;
continue;
}