给定一个字符串 S,计算 S 的不同非空子序列的个数。
因为结果可能很大,所以返回答案模 10^9 + 7.
示例 1:
输入:“abc”
输出:7
解释:7 个不同的子序列分别是 “a”, “b”, “c”, “ab”, “ac”, “bc”, 以及 “abc”。
示例 2:
输入:“aba”
输出:6
解释:6 个不同的子序列分别是 “a”, “b”, “ab”, “ba”, “aa” 以及 “aba”。
示例 3:
输入:“aaa”
输出:3
解释:3 个不同的子序列分别是 “a”, “aa” 以及 “aaa”。
提示:
S 只包含小写字母。
1 <= S.length <= 2000
题解
class Solution:
def distinctSubseqII(self, S: str) -> int:
dp=dict(zip('qwertyuioplkjhgfdsazxcvbnm',[0]*26))
#分别以26个字母结尾的子序列的数量
for s in S:
dp[s]=sum(dp.values())+1 #以s结尾的子序列的数量
return sum(dp.values())%1000000007
首先我们建立一个字典来保存以26个字母结尾的子序列,然后遍历字符串S,对于每个字符,我们更新以这个字符结尾的子序列数量,因为可以把26个字母结尾的子序列的末尾加上该字符,就能得到不同的序列了,但是这样每个子序列的长度都是大于1的,然后再加上这个字符本身。