刷题顺序以及题解参考卡哥的代码随想录
题目描述
英文版描述
Given two strings s and t, return the number of distinct subsequences of s which equals t.
The test cases are generated so that the answer fits on a 32-bit signed integer.
Example 1:
Input: s = "rabbbit", t = "rabbit"
Output: 3
Explanation:
As shown below, there are 3 ways you can generate "rabbit" from s.
rabbbit
rabbbit
rabbbit
Example 2:
Input: s = "babgbag", t = "bag"
Output: 5
Explanation:
As shown below, there are 5 ways you can generate "bag" from s.
babgbag
babgbag
babgbag
babgbag
babgbag
Constraints:
1 <= s.length, t.length <= 1000sandtconsist of English letters.
英文版地址
中文版描述
给你两个字符串 s ****和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10(9) + 7 取模。
示例 1:
输入: s = "rabbbit", t = "rabbit"输出: 3
解释:
如下所示, 有 3 种可以从 s 中得到"rabbit" 的方案。
rabbbit
rabbbit
rabbbit
示例 2:
输入: s = "babgbag", t = "bag"
输出: 5
解释:
如下所示, 有 5 种可以从 s 中得到"bag" 的方案。
babgbag
babgbag
babgbag
babgbag
babgbag
提示:
1 <= s.length, t.length <= 1000s和t由英文字母组成
中文版地址
解题方法
class Solution {
public int numDistinct(String s, String t) {
if (t.isEmpty()) {
return 1;
}
if (s == null || s.isEmpty() || t.length() > s.length()) {
return 0;
}
int[][] dp = new int[t.length()][s.length()];
if (t.charAt(0) == s.charAt(0)) {
dp[0][0] = 1;
}
for (int j = 1; j < s.length(); j++) {
if (t.charAt(0) == s.charAt(j)) {
dp[0][j] = dp[0][j - 1] + 1;
} else {
dp[0][j] = dp[0][j - 1];
}
}
for (int i = 1; i < t.length(); i++) {
for (int j = 1; j < s.length(); j++) {
if (t.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1];
} else {
dp[i][j] = dp[i][j - 1];
}
}
}
return dp[t.length() - 1][s.length() - 1];
}
}
复杂度分析
- 时间复杂度:O(n*m),其中 n 是数组t的元素数,m 是数组s的元素数
- 空间复杂度:O(n*m)