2025-08-11:奇偶频次间的最大差值Ⅰ。用go语言,给定一个只含小写字母的字符串 s。对任意两个字符 x 和 y(它们在
【摘要】 2025-08-11:奇偶频次间的最大差值Ⅰ。用go语言,给定一个只含小写字母的字符串 s。对任意两个字符 x 和 y(它们在 s 中的出现次数分别记为 count(x)、count(y)),当 count(x) 是奇数且 count(y) 是偶数时,考虑差值 count(x)−count(y)。在所有满足条件的字符对中取最大的差值并返回。这里 count© 表示字符 c 在字符串 s 中出...
2025-08-11:奇偶频次间的最大差值Ⅰ。用go语言,给定一个只含小写字母的字符串 s。对任意两个字符 x 和 y(它们在 s 中的出现次数分别记为 count(x)、count(y)),当 count(x) 是奇数且 count(y) 是偶数时,考虑差值 count(x)−count(y)。在所有满足条件的字符对中取最大的差值并返回。这里 count© 表示字符 c 在字符串 s 中出现的次数。
3 <= s.length <= 100。
s 仅由小写英文字母组成。
s 至少由一个出现奇数次的字符和一个出现偶数次的字符组成。
输入:s = “aaaaabbc”。
输出:3。
解释:
字符 ‘a’ 出现 奇数次 ,次数为 5 ;字符 ‘b’ 出现 偶数次 ,次数为 2 。
最大差值为 5 - 2 = 3 。
题目来自力扣3442。
分步骤描述过程
-
统计字符频次:
- 创建一个映射(map)
c,键为字符(rune),值为该字符在字符串中出现的次数。 - 遍历字符串
s的每个字符,更新映射c中的计数值。例如:- 字符
'a'出现 5 次,c['a'] = 5 - 字符
'b'出现 2 次,c['b'] = 2 - 字符
'c'出现 1 次,c['c'] = 1
- 字符
- 创建一个映射(map)
-
初始化关键变量:
maxOdd:记录所有奇数频次中的最大值,初始化为1(因奇数频次至少为 1)。minEven:记录所有偶数频次中的最小值,初始化为字符串长度(例如len(s) = 8),这是一个安全的上限值。
-
遍历频次映射,更新关键变量:
- 对映射
c中的每个频次值value:- 若
value是奇数(value % 2 == 1):- 比较
value与当前maxOdd,更新maxOdd = max(maxOdd, value)。 - 例如:
value = 5('a')时,maxOdd从 1 更新为 5;value = 1('c')时,maxOdd保持 5。
- 比较
- 若
value是偶数(value % 2 == 0):- 比较
value与当前minEven,更新minEven = min(minEven, value)。 - 例如:
value = 2('b')时,minEven从 8 更新为 2。
- 比较
- 若
- 对映射
-
计算并返回结果:
- 返回差值
maxOdd - minEven。 - 例如:
maxOdd = 5('a'),minEven = 2('b'),结果为5 - 2 = 3。
- 返回差值
时间复杂度和额外空间复杂度
- 时间复杂度:
O(n),其中n是字符串长度。- 遍历字符串统计频次:
O(n)。 - 遍历频次映射:映射键的数量最多为 26(小写字母),是常数操作
O(1)。
- 遍历字符串统计频次:
- 额外空间复杂度:
O(1)。- 频次映射
c最多存储 26 个键值对(小写字母),是常数空间。 - 变量
maxOdd和minEven占用常数空间。
- 频次映射
Go完整代码如下:
package main
import (
"fmt"
)
func maxDifference(s string) int {
c := make(map[rune]int)
for _, ch := range s {
c[ch]++
}
maxOdd, minEven := 1, len(s)
for _, value := range c {
if value%2 == 1 {
maxOdd = max(maxOdd, value)
} else {
minEven = min(minEven, value)
}
}
return maxOdd - minEven
}
func main() {
s := "aaaaabbc"
result := maxDifference(s)
fmt.Println(result)
}

Python完整代码如下:
# -*-coding:utf-8-*-
from collections import Counter
def max_difference(s: str) -> int:
counts = Counter(s)
max_odd = 1
min_even = len(s)
for v in counts.values():
if v % 2 == 1:
max_odd = max(max_odd, v)
else:
min_even = min(min_even, v)
return max_odd - min_even
if __name__ == "__main__":
s = "aaaaabbc"
result = max_difference(s)
print(result)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)