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.执行结果


浙公网安备 33010602011771号