在 LeetCode 上刷题刷到了一道 Hard 的题 115. 不同的子序列 ,用暴力递归的话,逻辑其实很好写,就是复杂度太高,测试用例复杂一些就直接GG,我就采用了牛客左程云左神的思想,将暴力递归改成动态规划,并通过评论区大神的思路将正向的动态规划进行优化变成逆向的动态规划。记录一下,进一步加深对动态规划的理解。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
题目描述
115. 不同的子序列
给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。
一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。
(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)
示例 1: 输入: S = "rabbbit", T = "rabbit" 输出: 3
解释: 有 3 种可以从 S 中得到 "rabbit" 的方案。
示例 2: 输入: S = "babgbag", T = "bag" 输出: 5
解释: 有 5 种可以从 S 中得到 "bag" 的方案。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
这一题,我的第一想法就是暴力递归,代码如下。通过记录当前走到的下标 i 和 j 来判断是否相等,若 s[ j ] == t[ i ], 则可以将 目标字符串的下标加一然后继续匹配(即选中当前字符)。其中,无论 s[ j ] 是否等于 t[ i ] 都需要不选择当前字符,然后继续进行递归。递归的终止条件为字符串 s 或 t 的下标走到最后的位置,当字符串 t 走到最终位置时,发生了一次匹配, res++