一、题目
1、题目描述
一位老师正在出一场由
n
道判断题构成的考试,每道题的答案为 true (用'T'
表示)或者 false (用'F'
表示)。老师想增加学生对自己做出答案的不确定性,方法是 最大化 有 连续相同 结果的题数。(也就是连续出现 true 或者连续出现 false)。给你一个字符串
answerKey
,其中answerKey[i]
是第i
个问题的正确结果。除此以外,还给你一个整数k
,表示你能进行以下操作的最多次数:
- 每次操作中,将问题的正确答案改为
'T'
或者'F'
(也就是将answerKey[i]
改为'T'
或者'F'
)。请你返回在不超过
k
次操作的情况下,最大 连续'T'
或者'F'
的数目。
2、接口描述
python3
class Solution:
def maxConsecutiveAnswers(self, answerKey: str, k: int) -> int:
cpp
class Solution {
public:
int maxConsecutiveAnswers(string answerKey, int k) {
}
};
C#
public class Solution {
public int MaxConsecutiveAnswers(string answerKey, int k) {
}
}
3、原题链接
二、解题报告
1、思路分析
考虑一个窗口是否可以变为连续?
只要窗口内的T或F的个数小于等于k即可
那么我们维护一个变长滑窗,保证滑窗内 T 或 F的个数小于等于k
滑窗的最大长度就是答案
2、复杂度
时间复杂度: O(N)空间复杂度:O(N)
3、代码详解
python3
class Solution:
def maxConsecutiveAnswers(self, answerKey: str, k: int) -> int:
cnt = [0] * 2
answerKey = list(map(ord, answerKey))
res = l = 0
for r, x in enumerate(answerKey):
cnt[x >> 1 & 1] += 1
while cnt[0] > k and cnt[1] > k:
cnt[answerKey[l] >> 1 & 1] -= 1
l += 1
res = max(res, r - l + 1)
return res
cpp
class Solution {
public:
int maxConsecutiveAnswers(string answerKey, int k) {
int n = answerKey.size();
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
a[i] = answerKey[i] == 'T' ? 1 : 0;
}
int res = 0, l = 0;
int cnt[2]{0};
for (int i = 0; i < n; ++ i) {
cnt[a[i]] ++;
while (cnt[0] > k && cnt[1] > k)
cnt[a[l ++]] --;
res = std::max(res, i - l + 1);
}
return res;
}
};
C#
public class Solution {
public int MaxConsecutiveAnswers(string answerKey, int k) {
int n = answerKey.Length;
int[] a = new int[n];
for (int i = 0; i < n; ++ i) {
a[i] = answerKey[i] == 'T' ? 1 : 0;
}
int res = 0, l = 0;
int[] cnt = new int[2];
for (int i = 0; i < n; ++ i) {
cnt[a[i]] ++;
while (cnt[0] > k && cnt[1] > k)
cnt[a[l ++]] --;
res = Math.Max(res, i - l + 1);
}
return res;
}
}