蓝桥杯 子串分值 详解 python

博客分析了一道算法题,探讨如何高效计算字符串中某个字符出现在有效子串中的次数。通过举例说明,解释了如何计算每个字符对f值的贡献,并提出了利用字符下标找到有效子串个数的方法。最终给出AC代码实现,通过遍历字符串和字符集来计算总和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接http://oj.ecustacm.cn/problem.php?id=1519

题目分析

题目中比较重要的信息就是 f的值仅受到在连续字串中出现一次的字符的影响。直接统计所有子串中单个字符的个数时间上过不去,那么,我们可以考虑单个字符带来的贡献值。(核心思想:换位思考

看样例:‘ababc’

我们看第二个a,虽然它可以处于多个子串中,但是如果这个子串里面还包含了其它a的话,那么这个’a’就不能对f的值产生贡献(使f的总和增加)了。而它每处于一个有效子串(除开它自己没有别的a的子串)中,f的总值就增加1。

第二个a:
在子串‘aba*‘中对f值无贡献 (*表示任意后续,可为空)
在子串’a’,‘ab’,‘abc’,‘ba’,‘bab’,'babc’中均对f值贡献了1,总共贡献6

所以,我们统计每一个字符处于多少个有效子串中即可计算出f的总和。

如何计算有效子串呢?

还是看刚刚的第二个’a’,它所处的子串要有效,就得不能包含别的‘a‘。那么我们先找到不包含其他’a’的最长子串:‘babc’
现在要做的就是找到这个串中包含’a’的连续子串的个数,如何找呢?
可以这样考虑,由于要包含’a‘,那么子串中a前面的字符选择就有:

‘b’,’’(空) 共2种情况

后面的字符选择有:

‘’(空),‘b’,‘bc’ 共3种情况

那么子串的情况就有 2×3=6种。( 即(a前面的字符个数+1) × ( a后面的字符个数+1)或 (该’a’的下标 - 上个‘a’的下标)×(下个’a’的下标 - 该’a’的下标))

要找所有a的贡献,就可以找到所有a的下标:

0,2

首尾再分别加上 -1 和 输入字符串S的长度(处理首尾的‘a’):

-1,0,2,5

三个一组,即(-1,0,2)和(0,2,5)两组。计算 (0-(-1))×(2-0)+(2-0)×(5-2)即为这两个a的贡献总值。

AC代码:

s=input()
c='a'
ans=0
while ord(c) <= ord('z'):#ord:字符转ascii码
    if c in s:
        li=[-1]
        for i in range(len(s)):
              if s[i] == c:
                  li.append(i)
        li.append(len(s))
        for i in range(2,len(li)):
            ans+=(li[i]-li[i-1])*(li[i-1]-li[i-2])
    c=chr(ord(c)+1)

print(ans)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值