每日一题-考试的最大困扰度

2024. 考试的最大困扰度

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-the-confusion-of-an-exam

题目

一位老师正在出一场由 n 道判断题构成的考试,每道题的答案为 true (用 'T' 表示)或者 false (用 'F' 表示)。老师想增加学生对自己做出答案的不确定性,方法是 最大化连续相同 结果的题数。(也就是连续出现 true 或者连续出现 false)。
给你一个字符串 answerKey ,其中 answerKey[i] 是第 i 个问题的正确结果。除此以外,还给你一个整数 k ,表示你能进行以下操作的最多次数:

  • 每次操作中,将问题的正确答案改为 'T' 或者 'F' (也就是将 answerKey[i] 改为 'T' 或者 'F'
    请你返回在不超过 k 次操作的情况下,最大 连续 'T' 或者 'F' 的数目。

提示:

  • n == answerKey.length
  • 1 <= n <= 5 * 1e4
  • answerKey[i] 要么是 'T' ,要么是 'F'
  • 1 <= k <= n

思路

题目说的很绕,其实就是求不多于k次替换时最长连续子串长度。用滑动窗口,lr分别为窗口左右边界这里左闭右开。

  1. r处字符加入窗口,如果仍符合要求保存最大长度
  2. r处字符加入窗口不满足要求则一边移动l一边判断

要想连续最长,肯定是把出现少的字符替换成多的那个,因此这里条件即为:min('T','F') <= k

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
int maxConsecutiveAnswers(string answerKey, int k) {
int l = 0;
int r = 0;
int ans = 0;
int curT = 0;
int curF = 0;
while(r < answerKey.size()) {
if (answerKey[r] == 'T') {
++curT;
} else {
++curF;
}
++r;
while(min(curT,curF) > k) {
// 移动左边直到满足条件
if (answerKey[l] == 'T') {
--curT;
} else {
--curF;
}
++l;
}
ans = max(ans,r-l);
}
return ans;
}
}
;