LeetCode 3442.奇偶频次间的最大差值 I:计数

【LetMeFly】3442.奇偶频次间的最大差值 I:计数

力扣题目链接:https://leetcode.cn/problems/maximum-difference-between-even-and-odd-frequency-i/

给你一个由小写英文字母组成的字符串 s 。请你找出字符串中两个字符的出现频次之间的 最大 差值,这两个字符需要满足:

  • 一个字符在字符串中出现 偶数次
  • 另一个字符在字符串中出现 奇数次 。

返回 最大 差值,计算方法是出现 奇数次 字符的次数 减去 出现 偶数次 字符的次数。

 

示例 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 <= 100
  • s 仅由小写英文字母组成。
  • s 至少由一个出现奇数次的字符和一个出现偶数次的字符组成。

解题方法:计数

遍历一遍字符串,统计出每种字符的出现次数。

遍历英文单词的每种字符:

  • 若这种字符出现次数为奇数次,则更新a1的值
  • 否则若这种字符出现次数大于0,则更新a2的值

最终返回 a 1 − a 2 a_1-a_2 a1a2

  • 时间复杂度 O ( l e n ( s ) + C ) O(len(s)+C) O(len(s)+C),其中 C = 26 C=26 C=26
  • 空间复杂度 O ( C ) O(C) O(C)

AC代码

C++
/*
 * @Author: LetMeFly
 * @Date: 2025-06-10 23:07:14
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-06-10 23:14:08
 */
class Solution {
public:
    int maxDifference(string s) {
        int cnt[26] = {0};
        for (char c : s) {
            cnt[c - 'a']++;
        }
        int a1 = 0, a2 = 100;
        for (int c : cnt) {
            if (c % 2) {
                a1 = max(a1, c);
            } else if (c) {
                a2 = min(a2, c);
            }
        }
        return a1 - a2;
    }
};
Python
'''
Author: LetMeFly
Date: 2025-06-10 23:07:14
LastEditors: LetMeFly.xyz
LastEditTime: 2025-06-10 23:18:45
'''
from collections import Counter

class Solution:
    def maxDifference(self, s: str) -> int:
        cnt = Counter(s)
        return max(v for v in cnt.values() if v % 2) - min(v for v in cnt.values() if v % 2 == 0)
Java
/*
 * @Author: LetMeFly
 * @Date: 2025-06-10 23:07:14
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-06-10 23:40:04
 */
class Solution {
    public int maxDifference(String s) {
        int[] cnt = new int[26];
        for (char c : s.toCharArray()) {
            cnt[c - 'a']++;
        }
        int a1 = 0, a2 = 100;
        for (int t : cnt) {
            if (t % 2 == 1) {
                a1 = Math.max(a1, t);
            } else if (t > 0) {
                a2 = Math.min(a2, t);
            }
        }
        return a1 - a2;
    }
}
Go
/*
 * @Author: LetMeFly
 * @Date: 2025-06-10 23:07:14
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-06-10 23:20:56
 */
package main

func maxDifference(s string) int {
    cnt := [26]int{}
    for _, c := range s {
        cnt[c - 'a']++
    }
    a1, a2 := 0, 100
    for _, t := range cnt {
        if t % 2 == 1 {
            a1 = max(a1, t)
        } else if t > 0 {
            a2 = min(a2, t)
        }
    }
    return a1 - a2
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tisfy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值