LeetCode: Distinct Subsequences [115]

LeetCode: Distinct Subsequences [115]

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

【称号】

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中的若干个字符能够得到T,则T称为S的子序列。问有多少种删法能够得到T


【思路】

    DP问题。
    定义A[i][j] (i>j)表示S[1…i]转化到T[1…j]的方式数(操作类型仅仅有一种。那就是从S中删除若干字符)。
    转换方程例如以下:
        假设S[i]==T[j], A[i][j]=A[i-1][j-1]+A[i-1][j];
        假设S[i]!=T[j], A[i][j]=A[i-1][j];
        
    初始化矩阵
        起始点A[0][0]=1;
        第一行A[0][i]=0;
        第一列A[i][j]=1;

【代码】

class Solution {
public:
    int numDistinct(string S, string T) {
        if(S.length()==0 || S.length()==0)return 0;
        if(S.length()<T.length())return 0;          //假设S==T,返回1, 觉得有1种转换方式
        
        vector<vector<int> >matrix(S.length()+1, vector<int>(T.length()+1, 0));
        //初始化matrix[0][0]
        matrix[0][0]=1;
        //初始化对角线
        for(int j=1; j<=T.length(); j++)
            matrix[0][j]=0;
        //初始化第一列
        for(int i=1; i<=S.length(); i++)
            matrix[i][0]=1;
            
        //考虑其它i>j的情况
        for(int i=1; i<=S.length(); i++){
            for(int j=1; j<=T.length(); j++){
                if(S[i-1]==T[j-1])matrix[i][j]=matrix[i-1][j-1]+matrix[i-1][j];
                else matrix[i][j]=matrix[i-1][j];
            }
        }
        return matrix[S.length()][T.length()];
    }
};

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117649.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 闭包及作用域销毁练习

    闭包及作用域销毁练习闭包及作用域销毁练习题vari=1;functionfn(i){returnfunction(n){console.log(n+(++i))}}varf=fn(2);f(3);fn(5)(6);fn(7)(8);f(4)//输出打印结果(把下面的html复制到本地打开就有此题详解)//…

    2022年10月11日
  • MySQL递归查询 三种实现方式

    MySQL递归查询 三种实现方式我是以山东济南的行政区划作为示例的,数据库是MySQL话不多说,直接上示例代码!感觉阅读麻烦的伙伴可以直接下载资源:点我下载1.建表脚本1.1.建表DROPTABLEIFEXISTS`sys_region`;CREATETABLE`sys_region`(`id`int(50)NOTNULLAUTO_INCREMENTCOMMENT’地区主键编号’,`name`varchar(50)CHARACTERSETutf8COLLATEut

  • python读取图像数据的一些方法[通俗易懂]

    python读取图像数据的一些方法[通俗易懂]工作和学习中设计一个神经网络中经常需要设计一个数据载入器。首先第一件事我们要根据我们的任务要求确定一个数据提供的方法。如我们是一个分类任务,我们就需要读取数据和数据本身对应的标签。12除了分类任务之外当然还有一些图像到图像的任务,如…

  • hash碰撞解决方法

    hash碰撞解决方法Hash碰撞冲突我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰撞冲突。如下将介绍如何处理冲突,当然其前提是一致性hash。1.开放地址法开放地执法有一个公式:Hi=(H(key)+di)MODmi=1,2,…,k(k&lt;=m-1)其中,m为哈希表的表长。…

  • html使用toast弹窗,jQuery常用工具之message和toast弹窗插件「建议收藏」

    html使用toast弹窗,jQuery常用工具之message和toast弹窗插件「建议收藏」常用工具message和toast弹窗图片预览常用工具message和toast弹窗浏览器适配支持Chrome所有版本支持Firefox所有版本支持Safari所有版本不支持IE任何版本常用工具message和toast弹窗使用教程默认调用:alert(‘请打开麦克风’)支持多参数:alert({title:’我是标题’,content:’请打开https://huajiakeji.com/’…

  • iframe的高度自适应_div自适应高度

    iframe的高度自适应_div自适应高度Demo页面:主页面iframe_a.html,被包含页面iframe_b.htm和iframe_c.html下面开始讲:通过Google搜索iframe自适应高度,结果5W多条,搜索iframe高度自适应,结果2W多条。我翻了前面的几十条,刨去大量的转载,有那么三五篇是原创的。而这几篇原创里面,基本上只谈到如何自适应静的东西,就是没有考虑到JS操作DOM之后,如

    2022年10月12日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号