1. 题目
2. 思路
(1) 动态规划
- dp[i][j]表示s从下标i到末尾的子字符串中t从下标j到末尾的子字符串出现的个数。
- 从后往前转移状态,初始化时,令dp[i][n]=1,即均包含1个空字符串。
- 若两个字符相等,则累加dp[i+1][j+1],否则,只等于s中前一个字符的dp[i+1][j]。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public int numDistinct(String s, String t) {
int m = s.length();
int n = t.length();
if (m < n) {
return 0;
}
int[][] dp = new int[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
dp[i][n] = 1;
}
for (int i = m - 1; i >= 0; i--) {
char sChar = s.charAt(i);
for (int j = n - 1; j >= 0; j--) {
char tChar = t.charAt(j);
if (sChar == tChar) {
dp[i][j] = dp[i + 1][j + 1] + dp[i + 1][j];
} else {
dp[i][j] = dp[i + 1][j];
}
}
}
return dp[0][0];
}
}