您的位置:首页 > 产品设计 > UI/UE

Distinct Subsequences

2015-07-01 23:23 525 查看


Distinct Subsequences



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
.

Solution

This is a difficult dynamic programming problem. The solution refers to 
http://blog.csdn.net/abcbc/article/details/8978146
Use two dimensional array dp[][] to store the number of the matched substring.

1. dp[0][0] = 1 if S and T are all empty string.

2. dp[i][0] = 0 S is the empty string.

3. dp[0][i] = 1 T is the empty string.

4. dp[i][j] >= dp[i][j - 1], if S[i - 1] == T[i - 1], dp[i][j] = dp[i][j] + dp[i - 1][j - 1]

For example

          r     a     b     b     b    i     t

     1   1    1     1     1     1     1    1

r    0   1    1     1     1     1     1    1

a   0    0    1    1     1     1     1    1

b   0    0    0    1     2     3     3    3

b   0    0    0     0     1    3    3     3

i    0     0    0     0     0    0    3     3

t   0     0     0     0     0    0    0     3
public class Solution {
public int numDistinct(String s, String t) {
int lenS = s.length();
int lenT = t.length();

int[][] dp = new int[lenT + 1][lenS + 1];
dp[0][0] = 1;
for (int i = 1; i <= lenS; i++) {
dp[0][i] = 1;
}

for (int i = 1; i <= lenT; i++) {
dp[i][0] = 0;
}

for (int i = 1; i <= lenT; i++)
for (int j = 1; j <= lenS; j++) {
dp[i][j] = dp[i][j - 1];
if (t.charAt(i - 1) == s.charAt(j - 1))
dp[i][j] = dp[i][j] + dp[i - 1][j - 1];
}

return dp[lenT][lenS];
}
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: