Given a string S and a string T, count the number of distinct subsequences of T in S.
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 of"ABCDE"
while "AEC"
is not).
Here is an example:
S = "rabbbit"
, T = "rabbit"
Return 3
.
先对题意解释一下:
题目给出两个字符串S和T,求S的所有子串中与T相同的有多少个。
子串的定义为: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 of"ABCDE"
while "AEC"
is not).
定义f[i][j]表示S[0..i-1]的子串中有f[i][j]个与T[0..j-1]相同。
因此,
当S[i] == T[j]时,f[i+1][j+1] = f[i][j] + f[i][j+1];
当S[i] != T[j]时,f[i+1][j+1] = f[i][j+1]。
class Solution {
public:
int numDistinct(string S, string T) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int lS = S.length(), lT = T.length();
if (lS < lT) {
return 0;
}
int f[lS + 1][lT + 1];
memset(f, 0, sizeof(int) * (lS + 1) * (lT + 1));
for (int i = 0; i<= lS; i++) {
f[i][0] = 1;
}
for (int i = 1; i <= lS; i++) {
for (int j = 1; j <= i && j <= lT; j++) {
f[i][j] = S[i - 1] == T[j - 1] ? f[i - 1][j - 1] : 0;
if (i - 1 >= j) {
f[i][j] += f[i - 1][j];
}
}
}
return f[lS][lT];
}
};