美文网首页
LintCode 不同的子序列

LintCode 不同的子序列

作者: Arnold134777 | 来源:发表于2016-03-26 21:27 被阅读489次

给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。

子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。
样例
给出S = "rabbbit", T = "rabbit"

返回 3

分析:这里我们可以用f(i,j)表示S中前i个字符串中,T的前j个字符出现的次数,不管S[i]和T[j]相不相等,首先f(i,j)=f(i-1,j),其次要是S[i]==T[j]的话,f(i,j) = f(i-1,j)+f(i-1,j-1),可以看到,i的状态只与i-1有关,于是可以用滚动数组来进行优化。代码类似01背包。

public class Solution {
    /**
     * @param S, T: Two string.
     * @return: Count the number of distinct subsequences
     */
   public int numDistinct(String S, String T) {
        if(null == S || null == T)
            return 0;
        // commons 表示S中的前i个字符包含T的前j个字符的个数
        int[][] commons = new int[S.length() + 1][T.length() + 1];
        for(int i = 0;i <= S.length();i++)
        {
            commons[i][0] = 1;
        }
        for(int i = 1;i <= S.length();i++)
        {
            for(int j = 1;j <= T.length();j++)
            {
                
                if(S.charAt(i - 1) != T.charAt(j - 1))
                {
                    // 不包含S中的第i个
                    commons[i][j] = commons[i - 1][j];
                }
                else
                {
                    // dp思想,匹配结果分为包含S中的第i个与不包含第i个两种
                    commons[i][j] = commons[i - 1][j - 1] +  commons[i - 1][j];
                }
            }
        }       
        return commons[S.length()][T.length()];
    }
}

相关文章

  • LintCode 不同的子序列

    给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。 子序列字符串是原始字符串通过删除一些(或零个)产生的...

  • LintCode-不同的子序列-动态规划

    描述 给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。 子序列字符串是原始字符串通过删除一些(或零个)...

  • 乘积最大子序列

    LintCode题目地址找出一个序列中乘积最大的连续子序列(至少包含一个数)。

  • 子序列

    最长公共子序列(LCS)(lintcode 77) 描述:给出两个字符串,找到最长公共子序列(LCS),返回LCS...

  • 不同的子序列

    给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。 子序列字符串是原始字符串通过删除一些(或零个)产生的...

  • 不同的子序列

    dp存储该点含之前的所有子序列匹配的解个数。首先对第一列初始化,先确定第一个是否匹配然后再从第二位根据dp[0][...

  • LintCode 最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明 最长上升子序列的定义: 最长上升子序列问...

  • LintCode 最长上升子序列

    题目 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明最长上升子序列的定义:最长上升子序列...

  • lintcode 最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。说明最长上升子序列的定义:最长上升子序列问题是在...

  • lintcode 最长公共子序列

    给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。说明最长公共子序列的定义: 最长公共子序列问题是在...

网友评论

      本文标题: LintCode 不同的子序列

      本文链接:https://www.haomeiwen.com/subject/xqwdlttx.html