LeetCode每日一题2025-06-10
3442. 奇偶频次间的最大差值 I E
给你一个由小写英文字母组成的字符串 s 。
请你找出字符串中两个字符 a₁ 和 a₂ 的出现频次之间的 最大 差值 diff = a₁ - a₂,这两个字符需要满足:
a₁在字符串中出现 奇数次 。a₂在字符串中出现 偶数次 。
返回 最大 差值。
示例 1:
输入: s = “aaaaabbc”
输出: 3
解释:
- 字符
'a'出现 奇数次 ,次数为5;字符'b'出现 偶数次 ,次数为2。- 最大差值为
5 - 2 = 3。
示例 2:
输入: s = “abcabcab”
输出: 1
解释:
- 字符
'a'出现 奇数次 ,次数为3;字符'c'出现 偶数次 ,次数为 2 。- 最大差值为
3 - 2 = 1。
提示:
3 <= s.length <= 100s仅由小写英文字母组成。s至少由一个出现奇数次的字符和一个出现偶数次的字符组成。
问题分析
给定一个由小写英文字母组成的字符串 ,需要找出两个字符 , 的出现频次之间的最大差值:
其中,要求:
- 在字符串中出现 奇数次;
- 在字符串中出现 偶数次。
题目保证字符串中至少存在一个出现奇数次的字符和一个出现偶数次的字符。为求解此问题,需完成以下两部分工作:
- 频次统计:统计字符串中每个字符的出现次数;
- 奇偶分类与极值计算:在出现次数为奇数的字符集合和出现次数为偶数的字符集合中,分别找到最大奇次数和最小偶次数,二者之差即为所求的最大值。
算法思路
-
初始化计数结构
- 因为只涉及小写英文字母,共 26 个字符,可使用长度为 26 的整型数组
cnt来记录频次,下标 对应'a'$,$1$ 对应‘b’$,……, 对应 `‘z’$。
- 因为只涉及小写英文字母,共 26 个字符,可使用长度为 26 的整型数组
-
遍历字符串进行统计
- 对于字符串 中的每个字符 ,执行:
1
cnt[ord(c) - ord('a')] += 1
- 经过此步骤,
cnt[i]就是对应第 个字母在字符串中出现的总次数。
- 对于字符串 中的每个字符 ,执行:
-
划分奇数次与偶数次并求极值
- 定义两个变量:
max_odd用于记录出现次数为奇数的字符中的最大值,初始化为 。min_even用于记录出现次数为偶数的字符中的最小值,初始化为正无穷 。
- 遍历
cnt数组中的所有非零频次num:- 如果 (奇数),则更新:
- 如果 (偶数),则更新:
- 如果 (奇数),则更新:
- 由于题目保证存在至少一个奇数次和一个偶数次字符,因此遍历结束后
max_odd与min_even必定已被赋值过。
- 定义两个变量:
-
计算并返回最大差值
- 最终结果即为:
- 最终结果即为:
时间复杂度
- 统计频次时,需遍历整个字符串一次,时间复杂度为 ,其中 。
- 遍历频次数组(长度固定为 26)为 (常量级)。
- 因此整体时间复杂度为
代码分解
-
初始化阶段
1
cnt = [0] * 26
- 建立长度为 26 的整型数组
cnt,用于存储每个字母在字符串中的出现次数。
- 建立长度为 26 的整型数组
-
频次统计阶段
1
2for ch in s:
cnt[ord(ch) - ord('a')] += 1- 遍历字符串,累加每个字符对应的下标值。
-
奇偶分类与极值计算阶段
1
2
3
4
5
6
7
8
9
10
11
12
13
14max_odd = -1
min_even = float('inf')
for num in cnt:
if num == 0:
continue
if num % 2 == 1:
# 出现次数为奇数
if num > max_odd:
max_odd = num
else:
# 出现次数为偶数
if num < min_even:
min_even = num
代码实现
1 | class Solution: |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Stay hungry. Stay foolish.!
评论
