题目链接
思路
- 设f(i,j)是t的前j个字符在s前i个字符中出现的次数
- 如果s[i]=t[i] 那么在选择子串的时候,可以用s[i]去匹配t[i] (此时f(i,j)=f(i-1,j-1)),也可以不用s[i]去匹配t[i] (此时f(i,j)=f(i-1,j))
- 如果s[i]!=t[i] 那么s[i]并不能去匹配t[i] 此时f(i,j)=f(i-1,j)
- 所以状态转移方程为
f(i,j) = f(i-1,j-1) + f(i-1,j) 相等
f(i,j) =f(i-1,j) 不等 - 注意边界条件
- f(-1,-1)代表空串在空串的出现次数,是1
- f(-1,j)代表t的前j个字符串在s的前-1个字符串中出现的次数 应该是0
- f(i,-1)代表t的前-1个字符串(空串)在s的前i个字符串中出现的次数 应该是1
class Solution {
public int numDistinct(String s, String t) {
if(t.length() == 0)
return 1;
if(s.length() < t.length())
return 0;
int[][] dp = new int[2][t.length()+1];
dp[0][0] = 1;
for(int i = 1 ; i <= s.length() ; i++){
dp[i%2][0] = 1;
for(int j = 1 ; j <= t.length() ; j++){
dp[i%2][j] = dp[(i-1)%2][j] + (s.charAt(i-1) == t.charAt(j-1) ? dp[(i-1)%2][j-1] : 0);
}
}
return dp[s.length()%2][t.length()];
}
}