题目描述
一位老师正在出一场由 n 道判断题构成的考试,每道题的答案为 true (用 ‘T’ 表示)或者 false (用 ‘F’ 表示)。老师想增加学生对自己做出答案的不确定性,方法是 最大化 有 连续相同 结果的题数。(也就是连续出现 true 或者连续出现 false)。
给你一个字符串 answerKey ,其中 answerKey[i] 是第 i 个问题的正确结果。除此以外,还给你一个整数 k ,表示你能进行以下操作的最多次数:
每次操作中,将问题的正确答案改为 ‘T’ 或者 ‘F’ (也就是将 answerKey[i] 改为 ‘T’ 或者 ‘F’ )。
请你返回在不超过 k 次操作的情况下,最大 连续 ‘T’ 或者 ‘F’ 的数目。
示例
示例 1:
输入:answerKey = “TTFF”, k = 2
输出:4
解释:我们可以将两个 ‘F’ 都变为 ‘T’ ,得到 answerKey = “TTTT” 。
总共有四个连续的 ‘T’ 。
示例 2:
输入:answerKey = “TFFT”, k = 1
输出:3
解释:我们可以将最前面的 ‘T’ 换成 ‘F’ ,得到 answerKey = “FFFT” 。
或者,我们可以将第二个 ‘T’ 换成 ‘F’ ,得到 answerKey = “TFFF” 。
两种情况下,都有三个连续的 ‘F’ 。
示例 3:
输入:answerKey = “TTFTTFTT”, k = 1
输出:5
解释:我们可以将第一个 ‘F’ 换成 ‘T’ ,得到 answerKey = “TTTTTFTT” 。
或者我们可以将第二个 ‘F’ 换成 ‘T’ ,得到 answerKey = “TTFTTTTT” 。
两种情况下,都有五个连续的 ‘T’ 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-the-confusion-of-an-exam
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法
该题与1004. 最大连续1的个数 III相似,对于1004题,我们只需判断包含k个0的最长的1的字符串的最长字串。
- 滑动窗口方法(滑动窗口可视化及模板)
建立两个指针left和right,right主动滑动,left被动滑动,当当前字符串[left, right]中包含的0的个数大于k时被动滑动left指针。这样当right滑动到最右侧时,即可得到包含k个0的最长字符串。
代码(1004. 最大连续1的个数 III)
class Solution(object):
def longestOnes(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
res = 0
left, right = 0, 0
zeros = 0
n = len(nums)
while right < n:
if nums[right] == 0:
zeros += 1
while zeros > k:
if nums[left] == 0:
zeros -= 1
left += 1
res = max(res, right - left + 1)
right += 1
return res
代码(2024.考试的最大困扰度)
对于将0变成1,考试的最大困扰度中,可以将F变成T,也可以将T变成F。只需进行上述方法两次,然后求最大值即可。也可建立三个指针,left1, left2, right。left1记录含有k个F的,最长T的字符串的左指针,而left2记录含有k个T的,最长F的字符串的左指针。代码如下:
class Solution(object):
def maxConsecutiveAnswers(self, answerKey, k):
"""
:type answerKey: str
:type k: int
:rtype: int
"""
res = 0
left1, left2, right = 0, 0, 0
f,t = 0, 0
n = len(answerKey)
while right < n:
if answerKey[right] == 'F':
f += 1
if answerKey[right] == 'T':
t += 1
while f > k:
if answerKey[left1] == 'F':
f -= 1
left1 += 1
while t > k:
if answerKey[left2] == 'T':
t -= 1
left2 += 1
res = max(res, right - left1 + 1, right - left2 + 1)
right += 1
return res
滑动窗口模板(原文链接)
def findSubArray(nums):
N = len(nums) # 数组/字符串长度
left, right = 0, 0 # 双指针,表示当前遍历的区间[left, right],闭区间
sums = 0 # 用于统计 子数组/子区间 是否有效,根据题目可能会改成求和/计数
res = 0 # 保存最大的满足题目要求的 子数组/子串 长度
while right < N: # 当右边的指针没有搜索到 数组/字符串 的结尾
sums += nums[right] # 增加当前右边指针的数字/字符的求和/计数
while 区间[left, right]不符合题意:# 此时需要一直移动左指针,直至找到一个符合题意的区间
sums -= nums[left] # 移动左指针前需要从counter中减少left位置字符的求和/计数
left += 1 # 真正的移动左指针,注意不能跟上面一行代码写反
# 到 while 结束时,我们找到了一个符合题意要求的 子数组/子串
res = max(res, right - left + 1) # 需要更新结果
right += 1 # 移动右指针,去探索新的区间
return res