学到的东西:
- 应用动态规划
- c++中multimap的使用
解题思想类似leetcode中的
triangle,创建一个二维数组存储T的每个字符在S中的所有位置,从T的最后一个字符开始初始化这个二维数组,赋值为当前字符向后有多少个序列。
class Solution {
public:
int numDistinct(string S, string T) {
if (T.length() > S.length() || T.length() == 0)
return 0;
multimap
Map;
vector
*vPosition = new vector
[T.length()];
vector
*vSeq = new vector
[T.length()]; int posCount = 0, i; //T中所有字符插入表中 for (i = 0; i < T.length(); i++){ //if (Map.count(T[i]) == 0){ Map.insert(multimap
::value_type(T[i], posCount++)); //} } multimap
::iterator iter; multimap
::size_type count, j; //将S中T的所有字符的位置存入vPosition for (i = 0; i < S.length(); i++){ iter = Map.find(S[i]); count = Map.count(S[i]); for (j = 0; j < count; j++, iter++){ vPosition[iter->second].push_back(i); } } //vSeq最底层设置为1 for (i = 0; i < vPosition[T.length() - 1].size(); i++) vSeq[T.length() - 1].push_back(1); //动态规划从最底层到最顶层,resize默认为0 if (T.length() > 1) { int j, k; for (i = T.length() - 2; i >= 0; i--){ vSeq[i].resize(vPosition[i].size()); for (j = 0; j < vPosition[i].size(); j++){ for (k = 0; k < vPosition[i + 1].size(); k++){ if (vPosition[i][j] < vPosition[i + 1][k]) vSeq[i][j] += vSeq[i + 1][k]; } } } } int result = 0; for (i = 0; i < vSeq[0].size(); i++) result += vSeq[0][i]; return result; } };