#include <iostream>
#include <string.h>
using namespace std;
/*
蛮典型的dp,因为跟MIT的课程里的LCS算法很像,也是构建一个备忘表,
寻找备忘表元素之间的关系,关系无法一眼看出,后来看了分析,这样理解,
比如找的是(i,j)的次数,如果s[i]==t[j],那么有两种选法,一种是选了
s[i],那么(i,j)的次数就是(i-1,j-1)的次数;不选s[i]的话,就是
(i-1,j)的次数;如果s[i]!=t[j],就只有第二种选法了,也就是
(i-1,j)的次数。如果是像MIT公开课里面说的那样,用一个二维的备忘表,
那么就是从左上角到右下角的顺序计算就好了,比较直观,但是这样需要O(n^2)
的空间复杂度,改进的是用一个长度为T的长度加1的一位数组代替,这样复杂度
就只是O(n),不过注意的是这样的话虽然可以从上到下计算,但是计算每一行的
时候要从右到左,因为当前位置的值要用到上一行的前一个位置的值,这样算到
数组最后一个元素就是结果了。
*/
class Solution {
public:
int numDistinct(string s, string t) {
int len = t.length();
int *memo = new int[len + 1];
for (int i = 0; i < len + 1; i++) {
memo[i] = 0;
}
memo[0] = 1;
for (int i = 1; i < s.length() + 1; i++) {
for (int j = len - 1; j >= 0; j--) {
memo[j + 1] += s[i - 1] == t[j] ? memo[j] : 0;
}
}
return memo[len];
}
};
int main(int argc, const char * argv[]) {
Solution s;
cout << s.numDistinct("rabbbit", "rabbit") << endl;
return 0;
}
leetcode-115-Distinct Subsequences
最新推荐文章于 2022-05-06 21:36:07 发布