贡献度思想

本文介绍了如何利用贡献度思想解决字符串处理问题,特别是求解给定字符串所有子串中恰好出现一次的字符个数之和。通过枚举字符而非区间,计算每个字符的贡献度,从而优化算法。文章提供了两种具体问题的详细解题思路,并指出在不同的子串分值和问题中,贡献度思想的应用差异。
摘要由CSDN通过智能技术生成

例题一:字串分值

题目大意:求给定字符串所有字串的F(S)之和,规定F(S)表示为字符串S中恰好出现一次的字符的个数

 首先,我们先考虑暴力枚举的做法

先枚举区间的左端点,然后设置一个num数组,用来记录某个字符出现的次数。和sum,用来标记仅仅出现一次的字符的个数。(这里也可以使用set来判断某个字符有没有出现过,但不要使用set,而是unordered_set,因为我们不需要用到set的排序功能,只需要用到set的去重功能,而set的排序是需要O(logN)的时间的)

但这样做肯定会超时的,我们考虑能不能进行优化

根据题目范围,我们需要用一个O(NlogN),或者O(N)的算法

在上面的暴力算法中,我们枚举的是区间,然后在区间中找到仅出现一次的字符,而枚举区间是需要两重for循环的。那么,我们是不是可以直接枚举所有字符,然后找到这个字符仅仅出现一次的区间呢?

答案是可以的!我们只需要找到该字符Pos左边第一次出现的位置Left,和右边第一次出现的位置Right,那么该字符仅出现一次的区间个数为SUM=(Right - Pos)* (Pos - Left)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值