字符串S中包含字符串T的所有不同的子序列

7人阅读 评论(0) 收藏 举报
分类:

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.

看到有关字符串的子序列或者配准类的问题,首先应该考虑的就是用动态规划Dynamic Programming来求解,这个应成为条件反射。而所有DP问题的核心就是找出递推公式,想这道题就是递推一个二维的dp数组,下面我们从题目中给的例子来分析,这个二维dp数组应为:
这里写图片描述
首先,若原字符串和子序列都为空时,返回1,因为空串也是空串的一个子序列。若原字符串不为空,而子序列为空,也返回1,因为空串也是任意字符串的一个子序列。而当原字符串为空,子序列不为空时,返回0,因为非空字符串不能当空字符串的子序列。理清这些,二维数组dp的边缘便可以初始化了,下面只要找出递推式,就可以更新整个dp数组了。我们通过观察上面的二维数组可以发现,当更新到dp[i][j]时,dp[i][j] >= dp[i][j - 1] 总是成立,再进一步观察发现,当 T[i - 1] == S[j - 1] 时,dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1](dp[i-1][j-1]表示取T[i-1]和S[j-1]相等的结果,dp[i][j-1]表示取T[i-1]和S[j-2]相等的结果),若不等, dp[i][j] = dp[i][j - 1],所以,综合以上,递推式为:
dp[i][j] = dp[i][j - 1] + (T[i - 1] == S[j - 1] ? dp[i - 1][j - 1] : 0)

    int numDistinct(string S, string T) {
        if(S.empty())
            return 0;
        int n = T.size();
        int m = S.size();
        vector<vector<int>> vec(n+1, vector<int> (m+1, 0));
        for(int i = 0; i< m; i++){ 
            vec[0][i] = 1;
        }
        for(int i = 1; i<= n; i++){
            for(int j = 1; j <= m; j++){
                if(T[i-1] != S[j-1]) vec[i][j] = vec[i][j-1];
                else vec[i][j] = vec[i][j-1]+vec[i-1][j-1];
            }
        }
        return vec[n][m];
    }
查看评论

ASP.NET之‘字符串’

字符串和字符相互转换、字符类型的常见方法。字符串类型的基本方法,判断两个字符串相等(Equals)、查找字符串(Indexof)、判断包含字符串(Contains)、替换字符串(Replace)、截取字符串(substring)、删除和插入字符串(Remove/Inset)、分割字符串(Split)
  • 2017年05月22日 09:53

每天一道LeetCode-----计算字符串s中有多少个子序列和字符串t相等

Distinct Subsequences 原题链接Distinct Subsequences 判断字符串s中有多少个子序列和t相等,一个字符串的子序列是将字符串中若干字符删除后形成的字符串 ...
  • sinat_35261315
  • sinat_35261315
  • 2018-01-05 21:19:59
  • 128

Google算法题:不同的子序列出现目标串的次数

题目 九章算法链接 给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。 子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响...
  • iyangdi
  • iyangdi
  • 2017-08-26 12:19:49
  • 180

LintCode-不同的子序列

给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。 子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABC...
  • wangyuquanliuli
  • wangyuquanliuli
  • 2015-05-18 23:11:49
  • 2513

陈利人 面试题 给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。

原题   给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。例如s="abbbcb",t="abc",结果为3,即在s的所有子序...
  • cqs_2012
  • cqs_2012
  • 2013-12-06 12:15:33
  • 2485

【所有子序列问题】

public class AllSubSequence { /**  * 给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。 *...
  • u012334315
  • u012334315
  • 2013-11-21 01:59:15
  • 739

C++之练习题23

1.给定两个由大小写字母和空格组成的字符串s1 和s2,它们的长度都不超过100 个字符、也可以长度为0。判断压缩掉空格、并忽略大小写后,这两个字符串在是否相等。...
  • fenger1943
  • fenger1943
  • 2014-07-28 18:23:26
  • 620

UVa 10340(子序列)

UVa 10340(子序列) 题目:子序列 题目描述: 输入两个字符串s和t,判断是否可以从t中删除0个或多个字符(其它字符顺序不变),得到字符串s. 例如:abcde可以得到bce,但无...
  • u010555622
  • u010555622
  • 2014-07-08 02:38:14
  • 948

寻找字符串A中完全包含字符串B的最短子字符串

已知两个字符串a和b。寻找字符串a
  • linshengchao123
  • linshengchao123
  • 2014-10-31 20:07:45
  • 1714

给定字符串S和字符串T,找到S中的最小窗口,其中将包含复杂度O(n)中T中的所有字符。

本题源自LeetCode --------------------------------------------------------- 思路: 用俩个map,标记T的子串各个字符的数量。 ...
  • i_am_bird
  • i_am_bird
  • 2017-10-23 12:28:25
  • 117
    个人资料
    持之以恒
    等级:
    访问量: 1352
    积分: 409
    排名: 12万+
    文章存档
    最新评论