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
.
题目链接:https://leetcode.com/problems/distinct-subsequences/
题目分析:设dp[i][j]表示T的前缀0~(i-1)在S的前缀0~(j-1)中出现的次数,首先有dp[i][j] = dp[i][j - 1],若t[i] == s[j]则dp[i][j] += dp[i - 1][j - 1]
S="abcab",T="ab"
a b c a b
0 1 1 1 1 1 1
1 a 0 1 1 1 2 2
2 b 0 0 1 1 1 3
public class Solution {
public int numDistinct(String s, String t) {
int lens = s.length();
int lent = t.length();
if (lens < lent) {
return 0;
}
int[][] dp = new int[lent + 1][lens + 1];
for (int j = 0; j < lens; j ++) {
dp[0][j] = 1;
}
for (int i = 0; i < lent; i ++) {
for (int j = 0; j < lens; j ++) {
dp[i + 1][j + 1] = dp[i + 1][j];
if (t.charAt(i) == s.charAt(j)) {
dp[i + 1][j + 1] += dp[i][j];
}
}
}
return dp[lent][lens];
}
}