LeetCode(115) Distinct Subsequences

題目

Given a string S and a string T, count the number of distinct subsequences of T in S.git

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).github

Here is an example:
S = "rabbbit"T = "rabbit"數組

Return 3.測試

分析

題目給定兩個字符串,選擇只能夠用刪除字符的方法從第一個字符串變換到第二個字符串,求出一共有多少種變換方法;
又是動態規劃思想應用的典型題目。
  • 定義二維數組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[i],那麼dp[i][j] = dp[i-1][j],意思是若是當前字符不等,那麼就只能拋棄當前這個字符。
  • 遞歸公式中用到的dp[0][0] = 1,dp[i][0] = 0(把任意一個字符串變換爲一個空串只有一個方法)

AC代碼

 1 class Solution {
 2 public:
 3     /*用刪除的方法將串s變換到t,計算變換方法數*/
 4     int numDistinct(string s, string t) {
 5         if (s.empty() || t.empty())
 6             return 0;
 7         else if (s.length() < t.length())
 8             return 0;
 9         else
10         {
11             //動態規劃
12             int ls = s.length(), lt = t.length();
13             /*保存由字符串s(0,i) --> t(0,j)的方法數*/
14             vector<vector<int> > dp(ls + 1, vector<int>(lt + 1, 0));
15             dp[0][0] = 1;
16             for (int i = 0; i < ls; ++i)
17             {
18                 /*s(0,i) 轉換爲 t(0)的方法數爲1*/
19                 dp[i][0] = 1;
20             }//for
21             for (int i = 1; i <= ls; ++i)
22             {
23                 for (int j = 1; j <= lt; ++j)
24                 {
25                     /*首先無論當前字符是否相同,爲dp[i][j]賦初值*/
26                     dp[i][j] = dp[i - 1][j];
27                     if (s[i-1] == t[j-1])
28                     {
29                         /*若是s和t的當前字符相同,有兩種選擇保留或不保留*/
30                         dp[i][j] += dp[i - 1][j - 1];
31                     }//if
32                 }//for
33             }//for
34             return dp[ls][lt];
35         }
36     }    
37 };

GitHub測試程序源碼
相關文章
相關標籤/搜索