动态规划-计数dp-Distinct Subsequences II

2020-02-06 17:01:36

问题描述:

问题求解:

非常经典的计数dp问题,思路就是统计以每个字符为结尾的个数,最后求和即可。

dp[i] = sum of (dp[j]) 0 <= j <= i;可以理解为将最后的一个字符追加到前面的字符串后面。

问题是如何去重。

当我们遇到相同的字符的时候,首先最后一个字符单独最为subseq要删除,因为前面计算过了,其次,只能加到第一次碰到形同字符的位置,因为再前面的在这个重复字符的位置已经计算过了。

    int mod = (int)1e9 + 7;
    public int distinctSubseqII(String S) {
        int n = S.length();
        int[] dp = new int[n];
        Arrays.fill(dp, 1);
        for (int i = 0; i < n; i++) {
            for (int j = i - 1; j >= 0; j--) {
                if (S.charAt(i) != S.charAt(j)) dp[i] = (dp[i] % mod + dp[j] % mod) % mod;
                else {
                    dp[i] -= 1;
                    dp[i] = (dp[i] % mod + dp[j] % mod) % mod;
                    break;
                }
            }
        }
        int res = 0;
        for (int i = 0; i < n; i++) res = (res % mod + dp[i] % mod) % mod;
        return res;
    }

  

 

posted @ 2020-02-06 17:15  hyserendipity  阅读(158)  评论(0编辑  收藏  举报