1. 程式人生 > >lintcode - 不同的子序列

lintcode - 不同的子序列

logs code rabbit 刪除 aec -1 序列 urn ram

給出字符串S和字符串T,計算S的不同的子序列中T出現的個數。

子序列字符串是原始字符串通過刪除一些(或零個)產生的一個新的字符串,並且對剩下的字符的相對位置沒有影響。(比如,“ACE”“ABCDE”的子序列字符串,而“AEC”不是)。

樣例

給出S = "rabbbit", T = "rabbit"

返回 3

 1 class Solution {
 2 public:
 3     /*
 4      * @param : A string
 5      * @param : A string
6 * @return: Count the number of distinct subsequences 7 */ 8 int dp[220][220]; 9 int numDistinct(string S, string T) { 10 // write your code here 11 if(T.size() == 0) return 1; 12 else if(S.size() == 0) return 0; 13 14 memset(dp,0,sizeof(dp));
15 16 for(int i = 0; i < S.size(); ++i){ 17 if(S[i] == T[0]) dp[i][1] += 1; 18 } 19 int len = T.length(); 20 for(int i = 1; i < S.length(); ++i){ 21 for(int j = 1; j <= len && j <= i + 1; ++j){ 22 if
(S[i] == T[j-1]){ 23 dp[i][j] = max(dp[i][j], dp[i-1][j-1]); 24 //printf("%d %d %d\n",dp[i][j],i,j); 25 26 } 27 28 dp[i][j] += dp[i-1][j]; 29 } 30 } 31 return dp[S.length() - 1][len]; 32 } 33 };

dp[i][j] 表示,在S串中以 i 結尾時,長度為j的T的子串在S中的個數。

比如 S = “abcd” T = “” S長度為6,T長度為2

dp[5][2],代表S串以5結尾,S[5] 是 ",長度為2的T是 "" ,在S中的個數為 1。也就是整個S串裏,有1個T串。

dp[i][j]由什麽計算出來呢? 兩部分, 第一部分 是當 S[i] == T[j-1](j是長度) dp[i-1][j-1] 也就是 以 i-1結尾的 長度為j-1的T的子串的個數 第二部分是 dp[i-1][j] 也就是 前i-1裏長度為J的個數

lintcode - 不同的子序列