1781. 所有子字符串美丽值之和

目录

字符串美丽值之和问题解析与实现

题目描述

输入输出示例

示例 1

示例 2

解题分析

题目核心

主要挑战

朴素解法

解题方法

代码实现

关键点说明

复杂度分析

示例说明

优化思路(拓展)

总结


字符串美丽值之和问题解析与实现

题目描述

给定一个字符串 s,定义字符串的 美丽值 为:

出现频率最高的字符的出现次数 与 出现频率最低的字符的出现次数 之差。

例如,字符串 "abaacc" 的美丽值为:

  • 字符 'a' 出现了 3 次(最高频)
  • 字符 'b' 出现了 1 次(最低频)
  • 美丽值 = 3 - 1 = 2

题目要求:

统计字符串 s所有子字符串 的美丽值之和。


输入输出示例

示例 1

输入:

s = "aabcb"

输出:

5

解释:

美丽值不为零的子字符串包括:

["aab", "aabc", "aabcb", "abcb", "bcb"]

每个子串的美丽值均为 1,求和为 5。

示例 2

输入:

s = "aabcbaa"

输出:

17

解题分析

题目核心

  • 需要枚举所有子字符串(共有 O(n^2) 个子串)
  • 对每个子串,统计字符出现频率
  • 计算最高频与最低频的差值
  • 累加所有子串的美丽值

主要挑战

  • 字符串长度最多 500,枚举所有子串是可行的,但频率统计和频率差计算要高效,否则会超时
  • 字符只包含小写字母,字符集固定大小 26,可利用此特点优化频率统计

朴素解法

  • 双重循环遍历所有子串
  • 每次生成子串时维护字符频率数组
  • 每次计算美丽值需要遍历频率数组找最大和最小非零频率
  • 时间复杂度大约为 O(n^3),其中 n 是字符串长度

虽然复杂度较高,但由于 n 最大为 500,且字符集小,Python实现可接受。


解题方法

代码实现

class Solution:
    def beautySum(self, s: str) -> int:
        n = len(s)
        res = 0
        
        for i in range(n):
            freq = [0] * 26  # 26个小写字母的频率数组
            max_freq = 0
            min_freq = float('inf')
            
            for j in range(i, n):
                # 更新频率
                freq[ord(s[j]) - ord('a')] += 1
                
                # 更新最大频率
                max_freq = max(max_freq, freq[ord(s[j]) - ord('a')])
                
                # 找当前非零的最小频率
                min_freq = float('inf')
                for f in freq:
                    if f > 0 and f < min_freq:
                        min_freq = f
                
                # 累加美丽值
                res += max_freq - min_freq
        
        return res

关键点说明

  • 外层循环 i 代表子串起始位置
  • 内层循环 j 代表子串结束位置,边扩展子串边更新频率数组
  • 每次更新最大频率时直接比较当前字符频率即可
  • 最小频率需扫描频率数组,跳过频率为零的字符
  • 最后把美丽值(最大频率 - 最小频率)累加

复杂度分析

  • 枚举所有子串:O(n^2)
  • 每个子串更新频率后,寻找最小频率:O(26),常数级
  • 整体复杂度:O(n^2 * 26)O(n^2),对 n=500 可接受

示例说明

"aabcb" 为例:

  • 枚举所有子串,长度从1到5
  • 统计出现频率,计算美丽值
  • 例如子串 "aab"
    • 频率:a=2, b=1
    • 最大频率 = 2,最小非零频率 = 1
    • 美丽值 = 2 - 1 = 1
  • 类似的,子串 "bcb"
    • 频率:b=2, c=1
    • 美丽值 = 2 - 1 = 1
  • 最终所有美丽值求和得到 5。

优化思路(拓展)

  • 优化最小频率查找:维护一个数据结构,实时更新频率分布,减少对频率数组的扫描
  • 剪枝:当最大频率和最小频率相等时,可以提前结束,因为美丽值为0,后续子串也可能为0
  • 并行处理:利用多线程或并行加速(编程环境支持时)

总结

本题核心是枚举子串并统计字符频率计算美丽值。利用固定字符集大小和合理的嵌套循环结构,在题目给定范围内暴力解法完全可行且易于实现。

对字符串处理的能力和频率统计的思路有很好的锻炼。后续可尝试用更高级的数据结构优化性能

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值