目录
字符串美丽值之和问题解析与实现
题目描述
给定一个字符串 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
- 并行处理:利用多线程或并行加速(编程环境支持时)
总结
本题核心是枚举子串并统计字符频率计算美丽值。利用固定字符集大小和合理的嵌套循环结构,在题目给定范围内暴力解法完全可行且易于实现。
对字符串处理的能力和频率统计的思路有很好的锻炼。后续可尝试用更高级的数据结构优化性能
255

被折叠的 条评论
为什么被折叠?



