千家信息网

C++怎么解决不同的子序列问题

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"C++怎么解决不同的子序列问题",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C++怎么解决不同的子序列问题"吧!不同的子序列Exa
千家信息网最后更新 2026年11月01日C++怎么解决不同的子序列问题

这篇文章主要讲解了"C++怎么解决不同的子序列问题",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C++怎么解决不同的子序列问题"吧!

不同的子序列

Example 1:

Input: S =

"rabbbit"

, T =

"rabbit"
Output: 3

Explanation:

As shown below, there are 3 ways you can generate "rabbit" from S.
(The caret symbol ^ means the chosen letters)

rabbbit

^^^^ ^^

rabbbit

^^ ^^^^

rabbbit

^^^ ^^^

Example 2:

Input: S =

"babgbag"

, T =

"bag"
Output: 5

Explanation:

As shown below, there are 5 ways you can generate "bag" from S.
(The caret symbol ^ means the chosen letters)

babgbag

^^ ^

babgbag

^^ ^

babgbag

^ ^^

babgbag

^ ^^

babgbag

^^^

看到有关字符串的子序列或者配准类的问题,首先应该考虑的就是用动态规划 Dynamic Programming 来求解,这个应成为条件反射。而所有 DP 问题的核心就是找出状态转移方程,想这道题就是递推一个二维的 dp 数组,其中 dp[i][j] 表示s中范围是 [0, i] 的子串中能组成t中范围是 [0, j] 的子串的子序列的个数。下面我们从题目中给的例子来分析,这个二维 dp 数组应为:

Ø r a b b b i t
Ø 1 1 1 1 1 1 1 1
r 0 1 1 1 1 1 1 1
a 0 0 1 1 1 1 1 1
b 0 0 0 1 2 3 3 3
b 0 0 0 0 1 3 3 3
i 0 0 0 0 0 0 3 3
t 0 0 0 0 0 0 0 3

首先,若原字符串和子序列都为空时,返回1,因为空串也是空串的一个子序列。若原字符串不为空,而子序列为空,也返回1,因为空串也是任意字符串的一个子序列。而当原字符串为空,子序列不为空时,返回0,因为非空字符串不能当空字符串的子序列。理清这些,二维数组 dp 的边缘便可以初始化了,下面只要找出状态转移方程,就可以更新整个 dp 数组了。我们通过观察上面的二维数组可以发现,当更新到 dp[i][j] 时,dp[i][j] >= dp[i][j - 1] 总是成立,再进一步观察发现,当 T[i - 1] == S[j - 1] 时,dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1],若不等, dp[i][j] = dp[i][j - 1],所以,综合以上,递推式为:

dp[i][j] = dp[i][j - 1] + (T[i - 1] == S[j - 1] ? dp[i - 1][j - 1] : 0)

根据以上分析,可以写出代码如下:

class Solution {public:    int numDistinct(string s, string t) {        int m = s.size(), n = t.size();        vector> dp(n + 1, vector(m + 1));        for (int j = 0; j <= m; ++j) dp[0][j] = 1;        for (int i = 1; i <= n; ++i) {            for (int j = 1; j <= m; ++j) {                dp[i][j] = dp[i][j - 1] + (t[i - 1] == s[j - 1] ? dp[i - 1][j - 1] : 0);            }        }        return dp[n][m];    }};

感谢各位的阅读,以上就是"C++怎么解决不同的子序列问题"的内容了,经过本文的学习后,相信大家对C++怎么解决不同的子序列问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

序列 问题 字符 字符串 不同 数组 C++ 就是 二维 空串 学习 个子 内容 方程 状态 范围 S. 分析 更新 观察 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 中关村互联网科技集团 今日互联网科技 腾讯阿里互联网科技 深圳科技互联网 互联网科技集团 奇酷互联网络科技 赫美联合互联网科技 苏州大垚互联网科技 新华互联网科技校企合作 衡水科技产业互联网平台 恒生互联网科技指数跳水 银川新华互联网科技学校联系电话 烟台灵鸽互联网科技有限公司 2021世界互联网领先科技成果发布 米泉互联网科技专业怎么样 北京品多多互联网科技有限公司 互联网高科技绘画 科技互联网企业在行动 现代科技的标志之一的互联网 手冲咖啡和咖啡机区别 国智互联网科技 世界互联网领先科技成果 山东吉时兔互联网科技有限公司 中国的互联网科技企业的崛起 上海互联网科技公司ppt 广州有谷有贝互联网科技有限公司 互联网科技包装股 银川新华互联网科技学校是国营吗 每日互联网科技新闻
0