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;

总结:

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

相关推荐
rannn_1113 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
不会代码的小猴4 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
营养充电站4 小时前
VS Code Git 工作树:解锁多分支并行开发的高效体验
leetcode·决策树·逻辑回归·散列表·模拟退火算法
良木林6 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展
摇滚侠6 小时前
《SpringBoot 3:入门与应用实战》第 2 章 IOC 思想与实现 阅读笔记 1
spring boot·笔记·后端
蒸蒸yyyyzwd6 小时前
秋招不熟悉力扣学习笔记1
笔记·学习·leetcode
LuminousCPP8 小时前
数据结构-双向循环链表
c语言·数据结构·笔记·链表
白狐_7989 小时前
408数据结构第5章:树与二叉树②——遍历、线索树、森林与哈夫曼
数据结构·算法·深度优先
302wanger9 小时前
【阅读笔记】当AI拿走一切之后
笔记
Jasmine_llq10 小时前
《P15800 [GESP202603 六级] 选数》
数据结构·long long·逆序线性 dp·从后往前推导·转移严格遵循题意·防止总和溢出·复杂度on