• LeetCode(115) 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.

    分析

    题目给定两个字符串,选择只可以用删除字符的方法从第一个字符串变换到第二个字符串,求出一共有多少种变换方法;
    又是动态规划思想应用的典型题目。
    • 定义二维数组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测试程序源码
  • 相关阅读:
    VS2010+C#写的3D的Android游戏开源咯....不来看别后悔哦。
    把XAML放在服务端,即改即现.....
    TagSL框架设计(1)先来点简介
    OpenMP模式下多线程文件操作 (转)
    VS获取工程版本信息
    OpenMP模式下多线程文件操作(五)
    简单建立DLL和使用DLL
    OpenMP模式下多线程文件操作(三)
    OpenMP模式下多线程文件操作(四)
    【转】VC2008在工具栏Toolbar里添加XP风格spin box control控件
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214702.html
Copyright © 2020-2023  润新知