LeetCode刷题-115. 不同的子序列
题目链接:115. 不同的子序列
¶题解:
熟悉的动态规划又来了!
¶题目简述:
给定两个字符串,问按顺序可以从第一个字符串中找到多少种方案可以组成第二个字符!
¶题解:
**动态规划:**同样字符串前面加空格更好的处理边界问题!
状态表示: 两个字符串,使用二维数组f[i][j]
表示s
串前i
个字符和t
串前j
个字符的方案数
状态计算: 两种情况:
s[i] != t[j]
:则当前状态f[i][j] = f[i - 1][j]
,即为s
串前i - 1
个字符和t
串前j
个字符的方案数s[i] == t[j]
:则当前状态f[i][j] = f[i - 1][j] + f[i - 1][j - 1]
,即可以匹配最后一个字符即为f[i - 1][j - 1]
,也可以不匹配即为f[i - 1][j]
最终答案: f[n][m]
边界条件: f[i][0] = 1
,即s
串前i
个字符和t
串前0个字符(空格)的方案数都是1,s
一定有一个空格(开始部分)。
时间复杂度:O(nm)
¶AC代码:
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小牛博客!
评论