leetcode做题笔记115. 不同的子序列

给你两个字符串 st ,统计并返回在 s子序列t 出现的个数。

题目数据保证答案符合 32 位带符号整数范围。

思路一:动态规划

cpp 复制代码
int numDistinct(char * s, char * t){
    int len1=strlen(s),len2=strlen(t);
    uint64_t dp[len1+1][len2+1];
    memset(dp,0,sizeof dp);
    for(int i=0;i<=len1;i++)
        dp[i][0]=1;
    
    for(int i=1;i<=len1;i++)
    {
        for(int j=1;j<=len2;j++)
      {     
            if(s[i-1]!=t[j-1])
                dp[i][j]=dp[i-1][j];
            else
                dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
        }
    }
    if(dp[len1][len2]>INT_MAX)return -1;
    return dp[len1][len2];
}

分析:

本题要计算t在s子序列的个数,可想到使用动态规划的方法,根据两个字符串的顺序不断向后匹配,当匹配的相同位置字符不相同时调用前面匹配成功的dpi-1j,当字符相同时dpij=dpi-1j-1+dpi-1j最后判断是否大于int范围,返回dplen1len2;

总结:

本题考察动态规划在字符串之中的应用,考虑每一位匹配的结果调用前一位的结果即可解决

相关推荐
伊布拉西莫8 小时前
【流畅的Python】第20章:并发执行器 — 学习笔记
笔记·python·学习
Darling噜啦啦8 小时前
JavaScript 数组深度解析:从纯函数到二维数组陷阱,一文吃透前端数据结构核心
前端·javascript·数据结构
AOwhisky9 小时前
学习自测与解析:MySQL第五、六、七期核心知识点详解
运维·数据库·笔记·学习·mysql·云计算
niuniuyi~9 小时前
QT学习笔记
笔记·qt·学习
咸甜适中9 小时前
rust语言学习笔记Trait(十六)Error(错误)
笔记·学习·rust
不会就选b10 小时前
数据结构之链表OJ题(中)
数据结构·链表
J2虾虾10 小时前
C语言 typedef 用法
c语言·数据结构·算法
xuhaoyu_cpp_java10 小时前
项目学习(三)代码生成器
java·经验分享·笔记·学习
my_daling10 小时前
松下伺服驱动器参数保存流程(已在松下A5上验证)
笔记
兰令水10 小时前
leecodecode【区间DP+树形DP】【2026.6.10打卡-java版本】
java·算法·leetcode