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
.
我们假设有个二维数组cache[t.length() + 1][s.length() + 1], cache[ i ] [ j ] 表示 S[ 0 ... j ] 包含 T [ 0 .. i ] 的不同子序列的个数。
当 i = 0时候,意味着T 为"", 对于任意的S,都能形成数量为1的。当 j = 0, 一个空字符不可能是任意字符的子串,所以值为0。
当 i > 0 且 j > 0的时候,如果T[ i ] == S [ j ] ,那么此时的序列个数为它的左边的加上对角线的。cache[ i ] [ j ] = cache[ i ] [ j - 1] + cache[ i - 1] [ j - 1];如果T[ i ] != S [ j ] ,此时的序列个数为它的左边的。cache[ i ] [ j ] = cache [ i ] [ j - 1 ]。
最后cache[ t.length() ] [ s.length() ] 为最后的返回结果。
运行时间:
代码:
public class DistinctSubsequences {
public int numDistinct(String s, String t) {
int[][] cache = new int[t.length() + 1][s.length() + 1];
for (int j = 0; j < s.length() + 1; j++) {
cache[0][j] = 1;
}
for (int i = 1; i < t.length() + 1; i++) {
cache[i][0] = 0;
}
for (int i = 1; i < t.length() + 1; i++) {
for (int j = 1; j < s.length() + 1; j++) {
if (t.charAt(i - 1) == s.charAt(j - 1)) {
cache[i][j] = cache[i - 1][j - 1] + cache[i][j - 1];
} else {
cache[i][j] = cache[i][j - 1];
}
}
}
return cache[t.length()][s.length()];
}
}