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子序列的个数,可想到使用动态规划的方法,根据两个字符串的顺序不断向后匹配,当匹配的相同位置字符不相同时调用前面匹配成功的dp[i-1][j],当字符相同时dp[i][j]=dp[i-1][j-1]+dp[i-1][j]最后判断是否大于int范围,返回dp[len1][len2];

总结:

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

相关推荐
zhangrelay2 分钟前
ROS2学习研究版本推荐:Jazzy Jalisco(LTS长期支持版)AI版本251001
笔记·学习
大白的编程日记.1 小时前
【Linux学习笔记】线程概念和控制(二)
linux·笔记·学习
克里斯蒂亚诺更新2 小时前
OpenSSL 3.0对某些加密算法增加了限制
笔记
2401_841495643 小时前
【数据结构】红黑树的基本操作
java·数据结构·c++·python·算法·红黑树·二叉搜索树
随机惯性粒子群3 小时前
STM32控制开发学习笔记【基于STM32 HAL库】
笔记·stm32·嵌入式硬件·学习
♛小小小让让3 小时前
RabbitMQ (二)参数
笔记·python·rabbitmq
Run Freely9374 小时前
软件测试基础-day1
笔记
Le1Yu5 小时前
2025-9-28学习笔记
java·笔记·学习
小欣加油5 小时前
leetcode 1863 找出所有子集的异或总和再求和
c++·算法·leetcode·职场和发展·深度优先
C++chaofan5 小时前
项目中为AI添加对话记忆
java·数据结构·人工智能·redis·缓存·个人开发·caffeine