算法:动态规划
题目
url:https://leetcode-cn.com/problems/distinct-subsequences/
给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。
一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,”ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)
示例 1:
1 | 输入: S = "rabbbit", T = "rabbit" |
示例 2:
1 | 输入: S = "babgbag", T = "bag" |
分析
动态规划的本质是穷举法
拿第二个示例分析,S = “babgbag”, T = “bag”
b 在S中出现的可能性,存;b后a出现的可能性,存储;在ba的基础上g出现的可能性储存;
二维数组的解法,转化为1位数组的解法
Java解法
s的长度为n,t的长度为m,空间复杂度为O(m)的解法如下:
1 | class Solution { |
pre和temp的作用是 记录本轮更改之前的值,用于计算,防止”rabbbit”, “rabbit”这样的数据,一个s中的b,影响多个t中的b的计算