1. 程式人生 > >[leetcode-115-Distinct Subsequences]

[leetcode-115-Distinct Subsequences]

leet 轉換 定義 lan cnblogs distinct orm detail bsp

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.

思路:

參考http://blog.csdn.net/fly_yr/article/details/50408457 題目給定兩個字符串,選擇只可以用刪除字符的方法從第一個字符串變換到第二個字符串,求出一共有多少種變換方法; 又是動態規劃思想應用的典型題目。
  • 定義二維數組dp[i][j]為字符串s(0,i)變換到t(0,j)的變換方法。
  • 如果S[i]==T[j],那麽dp[i][j] = dp[i-1][j-1] + dp[i-1][j]。意思是:如果當前S[i]==T[j],那麽當前這個字母即可以保留也可以拋棄,所以變換方法等於保留這個字母的變換方法加上不用這個字母的變換方法。
  • 如果S[i]!=T[j],那麽dp[i][j] = dp[i-1][j],意思是如果當前字符不等,那麽就只能拋棄當前這個字符。
  • 遞歸公式中用到的dp[i][0] = 0(把任意一個字符串變換為一個空串只有一個方法)
class Solution {
public:
    /*用刪除的方法將串s變換到t,計算變換方法數*/
    int numDistinct(string s, string t) {
        if (s.empty() || t.empty())
            return 0;
        else if (s.length() < t.length())
            
return 0; else { //動態規劃 int ls = s.length(), lt = t.length(); /*保存由字符串s(0,i) --> t(0,j)的方法數*/ vector<vector<int> > dp(ls + 1, vector<int>(lt + 1, 0)); dp[0][0] = 1; for (int i = 0; i < ls; ++i) { /*s(0,i) 轉換為 t(0)的方法數為1*/ dp[i][0] = 1; }//for for (int i = 1; i <= ls; ++i) { for (int j = 1; j <= lt; ++j) { /*首先不管當前字符是否相同,為dp[i][j]賦初值*/ dp[i][j] = dp[i - 1][j]; if (s[i-1] == t[j-1]) { /*如果s和t的當前字符相同,有兩種選擇保留或不保留*/ dp[i][j] += dp[i - 1][j - 1]; }//if }//for }//for return dp[ls][lt]; } } };

[leetcode-115-Distinct Subsequences]