这篇文章主要讲解了“C++怎么解决不同的子序列问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么解决不同的子序列问题”吧!Example 1:Input: S =”rabbbit”, T =”rabbit”
Output:3Explanation: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:5Explanation: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 数组应为:首先,若原字符串和子序列都为空时,返回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)根据以上分析,可以写出代码如下:感谢各位的阅读,以上就是“C++怎么解决不同的子序列问题”的内容了,经过本文的学习后,相信大家对C++怎么解决不同的子序列问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是开发云,小编将为大家推送更多相关知识点的文章,欢迎关注!
这篇文章给大家分享的是有关Windows中如何把c盘无用的文件删掉的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.打开计算机,找到目录 C:UsersadminDocuments。(其中“admin”为你的用户名,以下不在重复)。…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。