Distinct subsequences
OJ: https://oj.leetcode.com/problems/distinct-subsequences/
Given a stringSAnd a stringT, Count the number of distinct subsequencesTInS.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie,"ACE"Is a subsequence"ABCDE"While"AEC"Is not ).
Here is an example:S="rabbbit",T="rabbit"
Return3.
Idea: dynamic planning. D [I] [J] = d [I] [J-1] + (T [I-1] = s [J-1]? D [I-1] [J-1]: 0 );
// DP: D[i][j] = D[i][j-1] + (T[i-1] == S[j-1] ? D[i-1][j-1] : 0);class Solution {public: int numDistinct(string S, string T) { int m = T.length(); int n = S.length(); if(!m) return 1; if(m > n) return 0; vector<vector<int> > D(m+1, vector<int>(n+1)); for(int i = 1; i <= m; ++i) D[i][0] = 0; for(int i = 0; i <= n; ++i) D[0][i] = 1; for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) D[i+1][j+1] = D[i+1][j] + (T[i] == S[j] ? D[i][j] : 0); return D[m][n]; }};
After improvement: space complexity O (T. Size ()).
Class solution {public: int numdistinct (string S, string t) {int M = T. length (); vector <int> num (m + 1, 0); // num [I] is distinct numbers of T [1 ,..., i] In string s num [0] = 1; for (INT I = 1; I <= S. length (); ++ I) for (Int J = min (I, m); j> = 1; -- j) // key to notice. if (T [J-1] = s [I-1]) num [J] + = num [J-1]; // num [J-1] is the last string, T [1 ,..., j-1] distinct numbers. Return num [m] ;}};
30. Distinct subsequences