题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝特别喜欢单调递增的事物。
在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串 lanqiao
中,如果取出字符 n
和 q
,则 nq
组成一个单调递增子序列。类似的单调递增子序列还有 lnq、i、ano
等等。 小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第二个字符和最后一个字符可以取到 ao
,取最后两个字符也可以取到 ao
。小蓝认为他们并没有本质不同。
对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个? 例如,对于字符串 lanqiao,本质不同的递增子序列有 21 个。它们分别是 l、a、n、q、i、o、ln、an、lq、aq、nq、ai、lo、ao、no、io、lnq、anq、lno、ano、aio
。
请问对于以下字符串(共 200200 个小写英文字母,分四行显示):
tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl
本质不同的递增子序列有多少个?
解答:
创建一个数组dp,然后将每一个值的dp[i]的值通过for循环找出前面比它字典序小的所有字母的值相加,然后减去它的前面跟它相同的字母对应的值,即为它到它前面相同字母的这一段的递增子序列的个数,然后将字符串中所有字母的值相加,就是字符串中所有的递增子序列的个数。
a = '''tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliq
ijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl'''
ans = [1]*len(a)
for i in range(len(a)):
for z in range(i):
if a[z] < a[i]: #如果这个字母的字典序比自己小,就加进去
ans[i] += ans[z]
elif a[z] == a[i]: #指在求出上一个与自己相同的字母到自己的这一段中的递增子序列
ans[i] -= ans[z]
print(sum(ans))