Leetcode2024.考试的最大困扰度
一、题目描述
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’ 的数目。
我们可以使用滑动窗口进行解题。
什么是滑动窗口?
二、思想
我们可以进行两次判断,一次判断连续T的数目,一次判断连续F的数目。
每次判断时都是一个滑动窗口模型。
需要注意的是,如果不相等字符数目没有超过最大次数,那么我们可以跳过,但是需要记录在哪个位置不一样。可以使用队列存储,方便取队首和删队尾。
如果超过了最大次数,那么我们就需要移动左窗口的位置,将其移动到队首元素的下一个位置。
三、代码
class Solution {
public:
int testTorF(string answerKey,char c,int k){
int l=0,r=0,max_len=0;
//不相等个数的标志
queue<int> q;
while(r<=answerKey.length()-1){
//如果窗口的右边界与当前所判断字符不相等时
while(c!=answerKey[r]){
q.push(r);
//小于等于k跳过
if(q.size()<=k) break;
else{
//大于k 说明超过了最大次数,将窗口左边界 移到第一个与判断字符不相等的位置
l=q.front()+1;
q.pop();
break;
}
}
max_len=max(max_len,r-l+1);
r++;
}
return max_len;
}
int maxConsecutiveAnswers(string answerKey, int k) {
if(answerKey.length()==0) return 0;
return max(testTorF(answerKey,'T',k),testTorF(answerKey,'F',k));
}
};