不同的子序列 · Distinct Subsequences

[抄题]:

给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。

子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”“ABCDE”的子序列字符串,而“AEC”不是)。 

Here is an example:
S = "rabbbit", T = "rabbit"

Return 3.

[思维问题]:

[一句话思路]:

由于要查找T。最后一位相同时可以同时删,不相同时只能删S,不能多删除T

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

怎么找出递推函数function:举实际的例子

 

[一刷]:

  1. f[0][0] = 1
  2. 扫描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

 

 [代码风格] :

 

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];
    }
};
View Code

 

posted @ 2018-02-11 17:50  苗妙苗  阅读(297)  评论(0编辑  收藏  举报