给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。
题目数据保证答案符合 32 位带符号整数范围。
示例 1:
输入:S = "rabbbit", T = "rabbit"
输出:3
解释:
如下图所示, 有 3 种可以从 S 中得到 "rabbit" 的方案。
(上箭头符号 ^ 表示选取的字母)
rabbbit
^^^^ ^^
rabbbit
^^ ^^^^
rabbbit
^^^ ^^^
思路
问题本质是抽出 中的几个子序列来组成 ,看有多少种方案;
class Solution {
public:
int n, m;
vector<vector<int>> f;
int dfs(int i, int j, string& s, string& t) {
if (j == m) return 1;
if (i == n) return 0;
if (f[i][j]!=-1)return f[i][j];
int c=0;
for (int k = i; k < n; k++) if (s[k] == t[j]) {
c+=dfs(k+1,j+1,s,t);
}
return f[i][j]=c;
}
int numDistinct(string s, string t) {
n=s.size(), m=t.size();
f.resize(n, vector<int>(m, -1));
return dfs(0, 0, s, t);
}
};
效率不高…
复杂度分析
状态转移的情况不难想,最难的是如何转移:
class Solution {
public:
int numDistinct(string s, string t) {
long n = s.size(), m = t.size(), f[n+1][m+1]; memset(f, 0, sizeof f);
if (n < m) return 0;
for (int i=0; i<=n; i++) f[i][0]=1;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++) {
if (s[i-1]==t[j-1]) f[i][j] = f[i-1][j] + f[i-1][j-1];
else f[i][j] = f[i-1][j];
}
return f[n][m];
}
};
复杂度分析
本文地址:https://blog.csdn.net/qq_43539599/article/details/107605955
如对本文有疑问, 点击进行留言回复!!
SQLSERVER中RANK OVER(PARTITION BY)的用法
Kaspersky Endpoint Security 10 for Windows version 10.2.6.3733 is no longer supported
网友评论