列表

详情


1987. 不同的好子序列数目

给你一个二进制字符串 binary 。 binary 的一个 子序列 如果是 非空 的且没有 前导 0 (除非数字是 "0" 本身),那么它就是一个  的子序列。

请你找到 binary 不同好子序列 的数目。

请你返回 binary 中 不同好子序列 的数目。由于答案可能很大,请将它对 109 + 7 取余 后返回。

一个 子序列 指的是从原数组中删除若干个(可以一个也不删除)元素后,不改变剩余元素顺序得到的序列。

 

示例 1:

输入:binary = "001"
输出:2
解释:好的二进制子序列为 ["0", "0", "1"] 。
不同的好子序列为 "0" 和 "1" 。

示例 2:

输入:binary = "11"
输出:2
解释:好的二进制子序列为 ["1", "1", "11"] 。
不同的好子序列为 "1" 和 "11" 。

示例 3:

输入:binary = "101"
输出:5
解释:好的二进制子序列为 ["1", "0", "1", "10", "11", "101"] 。
不同的好子序列为 "0" ,"1" ,"10" ,"11" 和 "101" 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int numberOfUniqueGoodSubsequences(string binary) { } };

java 解法, 执行用时: 17 ms, 内存消耗: 43.3 MB, 提交时间: 2023-09-28 23:30:30

//  一
class Solution {
    public int numberOfUniqueGoodSubsequences1(String binary) {
        int MOD = (int)(1e9)+7;
        char[] s = binary.toCharArray();
        int n = s.length;
        int rt =0;

        //dp[i][j]表示以字符 i结尾的 长度为j的 好序列种数
        int dp[][] = new int[2][n+1];
        for(int i = 0; i < n; i++){
         //逆序是为了避免影响下一个长度的值的更新
            // t 表示 i 是 0 还是 1
            int t = s[i]-'0';
            //当 长度j大于等于3时,种数等于所有长度为 j-1 的种数之和 ①
            for(int j = i+1; j > 2; j--){
                dp[t][j] = (dp[t][j-1]+dp[(t+1)%2][j-1])%MOD;
            }
            //参考思路部分
            dp[t][2] = dp[1][1];
            dp[t][1] = 1;
        }
        // 长度 1 到 n的好序列种数和即所求值
        for(int i = 1; i <= n; i++){
            rt = (((dp[0][i] + dp[1][i])%MOD)+rt)%MOD;
        }
        return rt;
    }
    
    public int numberOfUniqueGoodSubsequences(String binary) {
        int MOD = (int)(1e9)+7;
        int n = binary.length();
        int rt =0;
        int dp[][] = new int[2][4];
        for(int i = 0; i < n; i++){
            int t = binary.charAt(i)-'0';
            dp[t][3] = (((dp[t^1][3]+dp[t][3])%MOD) + (dp[t^1][2]+dp[t][2])%MOD)%MOD;
            dp[t][2] = dp[1][1];
            dp[t][1] = 1;
        }
        for(int i = 1; i < 4; i++){
            rt = (rt + (dp[0][i]+dp[1][i])%MOD)%MOD;
        }
        return rt;
    }
}

python3 解法, 执行用时: 172 ms, 内存消耗: 16.5 MB, 提交时间: 2023-09-28 23:29:18

class Solution:
    def numberOfUniqueGoodSubsequences(self, binary: str) -> int:
        mod = 10**9 + 7

        even = odd = 0
        for ch in binary:
            if ch == "0":
                even = (even + odd) % mod
            else:
                odd = (even + odd + 1) % mod
        
        ans = (even + odd + ("0" in binary)) % mod
        return ans

cpp 解法, 执行用时: 24 ms, 内存消耗: 12.5 MB, 提交时间: 2023-09-28 23:29:04

class Solution {
private:
    static constexpr int mod = 1000000007;

public:
    int numberOfUniqueGoodSubsequences(string binary) {
        int even = 0, odd = 0;
        for (char ch: binary) {
            if (ch == '0') {
                even = (even + odd) % mod;
            }
            else {
                odd = (even + odd + 1) % mod;
            }
        }

        int ans = (even + odd + (binary.find('0') != string::npos)) % mod;
        return ans;
    }
};

golang 解法, 执行用时: 16 ms, 内存消耗: 6.2 MB, 提交时间: 2023-09-28 23:28:27

func numberOfUniqueGoodSubsequences(s string) int {
	const mod int = 1e9 + 7
	f := [2]int{}
	for i := len(s) - 1; i >= 0; i-- {
		f[s[i]&1] = (f[0] + f[1] + 1) % mod
	}
	ans := f[1]
	if strings.Contains(s, "0") {
		ans = (ans + 1) % mod
	}
	return ans
}

上一题