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];

总结:

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

相关推荐
知无不研3 分钟前
选择排序算法
数据结构·算法·排序算法·选择排序
好学且牛逼的马3 分钟前
【Hot100|21-LeetCode 160. 相交链表】
算法·leetcode
郝学胜-神的一滴5 分钟前
Python中的bisect模块:优雅处理有序序列的艺术
开发语言·数据结构·python·程序人生·算法
Remember_9937 分钟前
Spring 事务深度解析:实现方式、隔离级别与传播机制全攻略
java·开发语言·数据库·后端·spring·leetcode·oracle
vortex515 分钟前
深度字典攻击(实操笔记·红笔思考)
前端·chrome·笔记
闪闪发亮的小星星18 分钟前
主旋参数(四元数)与欧拉参数
笔记·其他
bbq粉刷匠39 分钟前
Java-排序2
java·数据结构·排序算法
蒸蒸yyyyzwd1 小时前
算法学习笔记
笔记·算法
山岚的运维笔记1 小时前
SQL Server笔记 -- 第13章:IF...ELSE
数据库·笔记·sql·microsoft·sqlserver
雾岛听蓝1 小时前
C++11新特性(可变参数模板、新的类功能、STL中的一些新变化)
开发语言·c++·经验分享·笔记