115. 不同的子序列
https://leetcode-cn.com/problems/distinct-subsequences/submissions/
解法一:回溯(暴力)
虽然排除了一些不必要的情况,然而还是超时
解法二:dp
思路见:https://leetcode.com/problems/distinct-subsequences/discuss/37327/Easy-to-understand-DP-in-Java
简单来说就是用dp[i+1][j+1]
来表示t[0...i]
在s[0...j]
中匹配。为何要+1?因为dp[0][j]
均为1,表示空串在任何串中出现一次。dp[1...i][0]=0
,表示任何串在空串中都不出现。
关键是s[0...j]
和t[0...i]
,当s[j]==t[i]
时,子序列数有两种来源:
1.t[0...i-1]
在s[0...j-1]
中出现次数(加上s[j]和t[i]仍然匹配)
2.t[0...i]
在s[0...j-1]
中出现次数(不用看t[i]就已经匹配了)
当s[j]!=t[i]
时,子序列数不变
最后更新于