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. Subscribe to see which companies asked this question.
題目
給出字串S和字串T,計算S的不同的子序列中T出現的個數。 子序列字串是原始字串通過刪除一些(或零個)產生的一個新的字串,並且對剩下的字元的相對位置沒有影響。(比如,“ACE”是“ABCDE”的子序列字串,而“AEC”不是)。 樣例 給出S = "rabbbit", T = "rabbit" 返回 3
分析
利用動態規劃去做,我們用dp[i][j]表示S與T的前i個字元與前j個字元的匹配子串個數。可以知道: 1)初始條件:T為空字串時,S為任意字串都能匹配一次,所以dp[i][0]=1;S為空字串,T不為空時,不能匹配,所以dp[0]j=0。 2)若S的第i個字元等於T的第j個字元時,我們有兩種匹配的選擇:其一,若S的i-1字元匹配T的j-1字元,我們可以選擇S的i字元與T的j字元匹配;其二,若S的i-1字元子串已經能與T的j字元匹配,放棄S的i字元與T的j字元。因此這個情況下,dp[i][j]=dp[i-1][j-1]+dp[i-1][j]。 3)若S的第i個字元不等於T的第j個字元時,這時只有當S的i-1字元子串已經能與T的j字元匹配,該子串能夠匹配。因此這個情況下,dp[i][j]=dp[i-1][j]。
程式碼
public class Solution {
/**
* @param S, T: Two string.
* @return: Count the number of distinct subsequences
*/
public int numDistinct(String S, String T) {
// write your code here
if (S == null || T == null) {
return 0;
}
int[][] nums = new int[S.length() + 1][T.length() + 1];
for (int i = 0; i <= S.length(); i++) {
nums[i][0] = 1;
}
for (int i = 1; i <= S.length(); i++) {
for (int j = 1; j <= T.length(); j++) {
nums[i][j] = nums[i-1][j];
if (S.charAt(i - 1) == T.charAt(j - 1)) {
nums[i][j] += nums[i - 1][j - 1];
}
}
}
return nums[S.length()][T.length()];
}
}
複製程式碼