LeetCode 115. 不同的子序列(dp)

题意:

给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。
(例如,"ACE""ABCDE" 的一个子序列,而 "AEC" 不是)

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

数据范围:
0 <= s.length, t.length <= 1000
s 和 t 由英文字母组成

解法:

设s[1,n],t[1,m],
令d[i][j]表示s[1,i],能组成t串前j个字符的子序列数量,
一开始d[0][0]=1,转移方程:
d[i][j]+=d[i-1][j],
if(s[i]==t[j])d[i][j]+=d[i-1][j-1].

第一维可以滚动优化掉.

ps:
这题有个奇怪的地方就是,直接提交会在数据61/62处返回一个爆int错误,
然后我改成longlong就过了,真无语.

code:

const int maxm=1e3+5;
#define ll long long
ll d[maxm];
class Solution {
    
    
public:
    int numDistinct(string s, string t) {
    
    
        memset(d,0,sizeof d);
        int n=s.size(),m=t.size();
        s.insert(s.begin(),'$');
        t.insert(t.begin(),'#');
        d[0]=1;
        for(int i=1;i<=n;i++){
    
    
            for(int j=m;j>=1;j--){
    
    
                if(s[i]==t[j]){
    
    
                    d[j]+=d[j-1];
                }
            }
        }
        return (int)d[m];
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/114938978