蓝桥杯字串分值和,python

 思路:一开始我是对着这个示例进行模拟,没发现什么规律,然后我考虑每种字符如何对答案产生贡献,发现每种字符的贡献就是考虑这个字符在字串中作为第一个子串和中间字(包括末尾)出现的次数。

举个例子 ababa

a的贡献有 

  • a  (第一个a)
  • ab
  • aba
  • abab
  • ababa
  • ba
  • bab
  • baba
  • a(第二个a)
  • ab
  • aba
  • ba
  • a(第三个a)

很明显,我只需统计每个字符在字串中作为第一个子串(黑色串)和中间字串(包括末尾)(蓝色串)出现的次数能保证不多不漏。

代码:

mp=[[]for i in range(26)]
s=input()
a=0
l=len(s)
for i in range(l):
    mp[ord(s[i])-ord("a")].append(i+1)
    a+=(l-i)
ans=[[]for i in range(26)]
for i in range(26):
    if (len(mp[i])!=0):
        ans[i].append(mp[i][0]-1)
for i in range(26):
    for j in range(1,len(mp[i])):
        ans[i].append(mp[i][j]-mp[i][j-1]-1)



for i in range(26):
    for j in range(len(ans[i])):
        a+=(ans[i][j]*(l-mp[i][j]+1))
#print(ord("b")-ord("a"))
print(a)

通过情况:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值