[Leetcode] Distinct Subsequences 解题报告

本文探讨了一个在给定字符串中计算特定子序列出现次数的问题,通过动态规划方法实现高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.
» Solve this problem

A DP problem.
[解题方法]  
此题需要使用大数运算。使用一点 DP 即可。关键是如何得到递推关系,可以这样想,设母串的长度为 j,  
子串的长度为 i,我们要求的就是长度为 i 的字串在长度为 j 的母串中出现的次数,设为 t[i][j],若母串的最后一个字符与子串的最后一个字符不同,则长度为 i 的子串在长度为 j 的母串中出现的次数就是母串的前 j – 1 个字符中子串出现的次数,即 t[i][j] = t[i][j – 1],若母串的最后一个字符与子串的最后一个字符相同,那么除了前 j – 1 个字符出现字串的次数外,还要加上子串的前 i – 1 个字符在母串的前 j – 1 个字符中出现的次数,即 t[i][j] = t[i][j – 1] + t[i – 1][j – 1]。  
也可以用二维数组,这里图省事,直接用滚动数组了。

Code如下:

1:  int numDistinct(string S, string T) {  
2: // Start typing your C/C++ solution below
3: // DO NOT write int main() function
4: int match[200];
5: if(S.size() < T.size()) return 0;
6: match[0] = 1;
7: for(int i=1; i <= T.size(); i++)
8: match[i] = 0;
9: for(int i=1; i<= S.size(); i ++)
10: for(int j =T.size(); j>=1; j--)
11: if(S[i-1] == T[j-1])
12: match[j]+= match[j-1];
13: return match[T.size()];
14: }

已犯错误:
1. line 7,  应该是i<=T.size(), 因为把0作为边界使用了。
2. line 10, j应该从尾到头,因为每次要使用上一次loop的值。如果从头往尾扫的话,重复计算了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值