940. 不同的子序列 II

给定一个字符串 s,计算 s 的 不同非空子序列 的个数。因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。

字符串的 子序列 是经由原字符串删除一些(也可能不删除)字符但不改变剩余字符相对位置的一个新字符串。

例如,"ace" 是 "abcde" 的一个子序列,但 "aec" 不是。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/distinct-subsequences-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.Scanner;

class Solution {

    private static final int MOD = 1000000007;

    public static int distinctSubseqII(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        int all = 1;
        int[] dp = new int[26];

        for (int i = 0; i < s.length(); ++i) {
            int newNum = (all - dp[s.charAt(i) - 'a'] + MOD) % MOD;
            all = (all + newNum) % MOD;
            dp[s.charAt(i) - 'a'] = (dp[s.charAt(i) - 'a'] + newNum) % MOD;
        }

        return all - 1;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            System.out.println(distinctSubseqII(in.next()));
        }
    }
}
posted @ 2022-01-19 18:26  Tianyiya  阅读(52)  评论(0)    收藏  举报