题目:
940. 不同的子序列 II
题解:
官方题解
用 dp[k] 表示 s[0 .. k] 可以组成的不同子序列的数目,含空串。
如果 k+1 是从未出现的字符,则 dp[k+1] = 2 * dp[k]
如果 k+1 的字符最后一次在 i 处出现过,则 dp[k+1] = 2 * dp[k] - dp[i-1]
源码:
实际编码中,题解中的 dp[k] 对应编码中的 dp[k+1]
class Solution:
def distinctSubseqII(self, s: str) -> int:
MOD = 10 ** 9 + 7
last = {}
ans = [1]
for i, c in enumerate(s):
ans.append(ans[-1] * 2)
if c in last:
ans[-1] -= ans[last[c]]
last[c] = i
return (ans[-1] - 1) % MOD
if __name__ == "__main__":
print(Solution().distinctSubseqII("abc"))
print(Solution().distinctSubseqII("aba"))
print(Solution().distinctSubseqII("aaa"))
引申题目:
5857. 不同的好子序列数目
(分别维护 1 结尾 和 0 结尾的子序列的数目)
class Solution:
def numberOfUniqueGoodSubsequences(self, binary: str) -> int:
MOD = 10 ** 9 + 7
odd = even = 0
for c in binary:
if c == '0':
even = (even + odd) % MOD
else:
odd = (even + odd + 1) % MOD
return (even + odd + ('0' in binary)) % MOD
if __name__ == "__main__":
print(Solution().numberOfUniqueGoodSubsequences("001"))
print(Solution().numberOfUniqueGoodSubsequences("11"))
print(Solution().numberOfUniqueGoodSubsequences("101"))
|