LeetCode 115 Distinct Subsequences

chi633發表於2017-12-21

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()];
    }
}
複製程式碼

相關文章