class Solution {
public:
int numberOfUniqueGoodSubsequences(string binary) {
}
};
1987. 不同的好子序列数目
给你一个二进制字符串 binary
。 binary
的一个 子序列 如果是 非空 的且没有 前导 0 (除非数字是 "0"
本身),那么它就是一个 好 的子序列。
请你找到 binary
不同好子序列 的数目。
binary = "001"
,那么所有 好 子序列为 ["0", "0", "1"]
,所以 不同 的好子序列为 "0"
和 "1"
。 注意,子序列 "00"
,"01"
和 "001"
不是好的,因为它们有前导 0 。请你返回 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" 。
提示:
1 <= binary.length <= 105
binary
只含有 '0'
和 '1'
。原站题解
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 }