zoukankan      html  css  js  c++  java
  • [Leetcode] Distinct Subsequences 解题报告

    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.
    » Solve this problem

    A DP problem.
    [解题方法]  
    此题需要使用大数运算。使用一点 DP 即可。关键是如何得到递推关系,可以这样想,设母串的长度为 j,  
    子串的长度为 i,我们要求的就是长度为 i 的字串在长度为 j 的母串中出现的次数,设为 t[i][j],若母串的最后一个字符与子串的最后一个字符不同,则长度为 i 的子串在长度为 j 的母串中出现的次数就是母串的前 j - 1 个字符中子串出现的次数,即 t[i][j] = t[i][j - 1],若母串的最后一个字符与子串的最后一个字符相同,那么除了前 j - 1 个字符出现字串的次数外,还要加上子串的前 i - 1 个字符在母串的前 j - 1 个字符中出现的次数,即 t[i][j] = t[i][j - 1] + t[i - 1][j - 1]。  
    也可以用二维数组,这里图省事,直接用滚动数组了。

    Code如下:
    1:  int numDistinct(string S, string T) {  
    2: // Start typing your C/C++ solution below
    3: // DO NOT write int main() function
    4: int match[200];
    5: if(S.size() < T.size()) return 0;
    6: match[0] = 1;
    7: for(int i=1; i <= T.size(); i++)
    8: match[i] = 0;
    9: for(int i=1; i<= S.size(); i ++)
    10: for(int j =T.size(); j>=1; j--)
    11: if(S[i-1] == T[j-1])
    12: match[j]+= match[j-1];
    13: return match[T.size()];
    14: }

    已犯错误:
    1. line 7,  应该是i<=T.size(), 因为把0作为边界使用了。
    2. line 10, j应该从尾到头,因为每次要使用上一次loop的值。如果从头往尾扫的话,重复计算了。













  • 相关阅读:
    Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
    Twsited异步网络框架
    MySQL-python模块
    python3安装Fabric模块
    PInvoke.net Visual Studio Extension
    资源下载站
    WPF RTSP存储到一个文件中的位置
    Windows 7 中未能从程序集System.ServiceModel
    无法在WEB服务器上启动调试,Web 服务器配置不正确
    CS0016: 未能写入输出文件“c:WINDOWSMicrosoft.NETFramework.。。”--“拒绝访问
  • 原文地址:https://www.cnblogs.com/codingtmd/p/5079011.html
Copyright © 2011-2022 走看看