Leetcode 3445. 奇偶频次间的最大差值 II

1.题目基本信息

1.1.题目描述

给你一个字符串 s 和一个整数 k 。请你找出 s 的子字符串 subs 中两个字符的出现频次之间的 最大 差值,freq[a] - freq[b] ,其中:

  • subs 的长度 至少 为 k 。

  • 字符 a 在 subs 中出现奇数次。

  • 字符 b 在 subs 中出现偶数次。

返回 最大 差值。

注意 ,subs 可以包含超过 2 个 互不相同 的字符。.

子字符串 是字符串中的一个连续字符序列。

1.2.题目地址

https://leetcode.cn/problems/maximum-difference-between-even-and-odd-frequency-ii/description/

2.解题方法

2.1.解题思路

前缀和+滑动窗口+枚举

2.2.解题步骤

第一步,将s转成整数数组;并构建结果变量

第二步,枚举x和y,在每种x,y的组合中进行滑窗

  • 2.1.构建维护变量。l和r分别维护滑动窗口的左右端点;cnts1维护s[0:r+1]中各个字符的频数,cnts2维护s[0:l]中各个字符的频数;minPreSums维护各个情况下的最小前缀和(x的出现记为1,y的出现记为-1,其他记为0,大小等于cnts1[x]-cnts1[y]),minPreSums[0][0]维护偶数个x和偶数个y构成的最小前缀和,minPreSums[0][1]维护偶数个x和奇数个y构成的最小前缀和,minPreSums[1][0]维护奇数个x和偶数个y构成的最小前缀和,minPreSums[1][1]维护奇数个x和奇数个y构成的最小前缀和

  • 2.2.遍历s,枚举为i,num,更新维护变量

    • 2.2.1.根据窗口的右端点更新维护变量cnts1

    • 2.2.2.窗口左收缩,并更新维护变量minPreSums、cnts2、l

    • 2.2.3.更新结果变量result

    • 2.2.4.扩展右窗口

第三步,返回result

3.解题代码

python代码

class Solution:
    def maxDifference(self, s: str, k: int) -> int:
        # 思路:前缀和+滑动窗口+枚举
        # 第一步,将s转成整数数组;并构建结果变量
        n = len(s)
        s = [int(c) for c in s]
        result = -inf
        # 第二步,枚举x和y,在每种x,y的组合中进行滑窗
        for x in range(5):
            for y in range(5):
                if x == y:
                    continue
                # 2.1.构建维护变量。l和r分别维护滑动窗口的左右端点;cnts1维护s[0:r+1]中各个字符的频数,cnts2维护s[0:l]中各个字符的频数;minPreSums维护各个情况下的最小前缀和(x的出现记为1,y的出现记为-1,其他记为0,大小等于cnts1[x]-cnts1[y]),minPreSums[0][0]维护偶数个x和偶数个y构成的最小前缀和,minPreSums[0][1]维护偶数个x和奇数个y构成的最小前缀和,minPreSums[1][0]维护奇数个x和偶数个y构成的最小前缀和,minPreSums[1][1]维护奇数个x和奇数个y构成的最小前缀和
                l, r = 0, 0
                cnts1, cnts2 = [0] * 5, [0] * 5
                minPreSums = [[inf, inf], [inf, inf]]
                # 2.2.遍历s,枚举为i,num,更新维护变量
                while r < n:
                    # 2.2.1.根据窗口的右端点更新维护变量cnts1
                    cnts1[s[r]] += 1
                    # 2.2.2.窗口左收缩,并更新维护变量minPreSums、cnts2、l
                    while r - l + 1 >= k and cnts1[x] > cnts2[x] and cnts1[y] > cnts2[y]:
                        p, q = cnts2[x] % 2, cnts2[y] % 2
                        minPreSums[p][q] = min(minPreSums[p][q], cnts2[x] - cnts2[y])
                        cnts2[s[l]] += 1
                        l += 1
                    # 2.2.3.更新结果变量result
                    if r >= k - 1:
                        p = 1 if cnts1[x] % 2 == 0 else 0
                        q = 0 if cnts1[y] % 2 == 0 else 1
                        result = max(result, (cnts1[x] - cnts1[y]) - minPreSums[p][q])
                    # 2.2.4.扩展右窗口
                    r += 1
        # 第三步,返回result
        return result

4.执行结果

posted @ 2025-06-20 09:38  Geek0070  阅读(5)  评论(0)    收藏  举报