[抄题]:
给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。
子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。
Here is an example:
S = "rabbbit", T = "rabbit"
Return 3.
[思维问题]:
[一句话思路]:
由于要查找T。最后一位相同时可以同时删,不相同时只能删S,不能多删除T。
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
怎么找出递推函数function:举实际的例子
[一刷]:
- f[0][0] = 1
- 扫描s的每个字母前先初始化,在过程中累加
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
草稿上把+=写清楚
"aab"
"ab"
[总结]:
怎么找出递推函数function:举实际的例子。
求个数时,一般情况是等于,只有重复情况下 个数增多才是相加。
[复杂度]:Time complexity: O(n^2) Space complexity: O(n^2)
DP先想暴力解法:Cn x 不行
[英文数据结构或算法,为什么不用别的数据结构或算法]:
双序列DP
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
5. Longest Palindromic Substring 回文串最值 用dp
[代码风格] :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Solution { /* * @param : A string * @param : A string * @return: Count the number of distinct subsequences */ public int numDistinct(String s, String t) { //state int m = s.length(); int n = t.length(); int[][] f = new int[m + 1][n + 1]; //initialization //m == 0 for (int i = 0; i <= n; i++) { f[0][i] = 0; } // n == 0 for (int j = 0; j <= m; j++) { f[j][0] = 1; } //function for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { f[i][j] = f[i - 1][j]; if (s.charAt(i - 1) == t.charAt(j - 1)) { f[i][j] += f[i - 1][j - 1]; } } } //answer return f[m][n]; } };