写这个题的时候,有点忧郁的,因为不是很清楚最优的解法的复杂度是多少。不确定是否存在S.size() + T.size()的解法
我的解法最坏情况下的复杂度是S.size() * T.size(). 不过一般情况下的运行效率很高!
class Solution {
const static int MAXN = 1000 + 10;
int dp[MAXN];
vector<int> vc[1 << 8];
public:
int numDistinct(string S, string T) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
memset(dp, 0x00, sizeof(dp));
dp[0] = 1;
for(int i = 0; i < (1 << 8); ++ i)
vc[i].clear();
for(int i = 0; i < T.size(); ++ i)
vc[T[i]].push_back(i + 1);
for(int i = 0; i < S.size(); ++ i){
for(int j = vc[S[i]].size() - 1; j >=0; -- j){
int p = vc[S[i]][j];
dp[p] += dp[p - 1];
}
}
return dp[T.size()];
}
};