Distinct Subsequences

系统 1524 0

LeetCode:Distinct Subsequences

我的LeetCode解题报告索引

题目链接

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 .

题目大意:删除S中某些位置的字符可以得到T,总共有几种不同的删除方法

设S的长度为lens,T的长度为lent

算法1 :递归解法,首先,从个字符串S的尾部开始扫描,找到第一个和T最后一个字符相同的位置k,那么有下面两种匹配:a. T的最后一个字符和S[k]匹配,b. T的最后一个字符不和S[k]匹配。a相当于子问题:从S[0...lens-2]中删除几个字符得到T[0...lent-2],b相当于子问题:从S[0...lens-2]中删除几个字符得到T[0...lent-1]。那么总的删除方法等于a、b两种情况的删除方法的和。递归解法代码如下,但是通过大数据会超时:

            
               1
            
            
              class
            
            
               Solution {


            
            
               2
            
            
              public
            
            
              :


            
            
               3
            
            
              int
            
             numDistinct(
            
              string
            
             S, 
            
              string
            
            
               T) {


            
            
               4
            
            
              //
            
            
               IMPORTANT: Please reset any member data you declared, as


            
            
               5
            
            
              //
            
            
               the same Solution instance will be reused for each test case.
            
            
               6
            
            
              return
            
             numDistanceRecur(S, S.length()-
            
              1
            
            , T, T.length()-
            
              1
            
            
              );


            
            
               7
            
            
                  }


            
            
               8
            
            
              int
            
             numDistanceRecur(
            
              string
            
             &S, 
            
              int
            
             send, 
            
              string
            
             &T, 
            
              int
            
            
               tend)


            
            
               9
            
            
                  {


            
            
              10
            
            
              if
            
            (tend < 
            
              0
            
            )
            
              return
            
            
              1
            
            
              ;


            
            
              11
            
            
              else
            
            
              if
            
            (send < 
            
              0
            
            )
            
              return
            
            
              0
            
            
              ;


            
            
              12
            
            
              while
            
            (send >= 
            
              0
            
             && S[send] != T[tend])send--
            
              ;


            
            
              13
            
            
              if
            
            (send < 
            
              0
            
            )
            
              return
            
            
              0
            
            
              ;


            
            
              14
            
            
              return
            
             numDistanceRecur(S,send-
            
              1
            
            ,T,tend-
            
              1
            
            ) + numDistanceRecur(S,send-
            
              1
            
            
              ,T,tend);


            
            
              15
            
            
                  }


            
            
              16
            
             };
          

算法2 :动态规划,设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], dp[i][j] = dp[i-1][j]
  • 初始条件:当T为空字符串时,从任意的S删除几个字符得到T的方法为1

代码如下:                                                                                      本文地址

          
             1
          
          
            class
          
          
             Solution {


          
          
             2
          
          
            public
          
          
            :


          
          
             3
          
          
            int
          
           numDistinct(
          
            string
          
           S, 
          
            string
          
          
             T) {


          
          
             4
          
          
            //
          
          
             IMPORTANT: Please reset any member data you declared, as


          
          
             5
          
          
            //
          
          
             the same Solution instance will be reused for each test case.
          
          
             6
          
          
            int
          
           lens = S.length(), lent =
          
             T.length();


          
          
             7
          
          
            if
          
          (lent == 
          
            0
          
          )
          
            return
          
          
            1
          
          
            ;


          
          
             8
          
          
            else
          
          
            if
          
          (lens == 
          
            0
          
          )
          
            return
          
          
            0
          
          
            ;


          
          
             9
          
          
            int
          
           dp[lens+
          
            1
          
          ][lent+
          
            1
          
          
            ];


          
          
            10
          
                   memset(dp, 
          
            0
          
           , 
          
            sizeof
          
          
            (dp));


          
          
            11
          
          
            for
          
          (
          
            int
          
           i = 
          
            0
          
          ; i <= lens; i++)dp[i][
          
            0
          
          ] = 
          
            1
          
          
            ;


          
          
            12
          
          
            for
          
          (
          
            int
          
           i = 
          
            1
          
          ; i <= lens; i++
          
            )


          
          
            13
          
          
                    {


          
          
            14
          
          
            for
          
          (
          
            int
          
           j = 
          
            1
          
          ; j <= lent; j++
          
            )


          
          
            15
          
          
                        {


          
          
            16
          
          
            if
          
          (S[i-
          
            1
          
          ] == T[j-
          
            1
          
          
            ])


          
          
            17
          
                               dp[i][j] = dp[i-
          
            1
          
          ][j-
          
            1
          
          ]+dp[i-
          
            1
          
          
            ][j];


          
          
            18
          
          
            else
          
           dp[i][j] = dp[i-
          
            1
          
          
            ][j];


          
          
            19
          
          
                        }


          
          
            20
          
          
                    }


          
          
            21
          
          
            return
          
          
             dp[lens][lent];


          
          
            22
          
          
                }


          
          
            23
          
           };
        

【版权声明】转载请注明出处: http://www.cnblogs.com/TenosDoIt/p/3440022.html

 

 
 
标签:  leetcode

Distinct Subsequences


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论