给定一个长度为 m 且仅由大写英文字母组成的字符串 a,请问有多少个长度为 n 的字符串 b 满足
b 是 a 的子序列。
解题思路:
先定义一个二维数组 dp,其中 dp[i][j] 表示字符串 a 的前 i 个字符和字符串 b 的前 j 个字符中,有多少个 b 是 a 的子序列。
根据题目要求,可以得到以下边界条件:
- 当 j=0 时,b 中没有字符,此时 dp[i][0]=1;
- 当 i=0 时,a 中没有字符,此时 dp[0][j]=0。
然后考虑状态转移方程。
如果 a[i] 和 b[j] 相等,则 b 的子序列数量为 dp[i-1][j-1],因为此时可以将 a[i] 和 b[j] 匹配。如果 a[i] 和 b[j] 不相等,则 b 的子序列数量为 dp[i-1][j],因为此时不能将 a[i] 和 b[j] 匹配。
综上所述,状态转移方程为:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j] (a[i] = b[j]) dp[i][j] = dp[i-1][j] (a[i] ≠ b[j])
最后,答案就是 dp[m][n]。
时间复杂度:O(mn)
空间复杂度:O(mn)
参考代码:
class Solution {
public:
int numDistinct(string a, string b) {
int m = a.size(), n = b.size();
vector<vector
相关推荐
















