Leetcode笔记 每日一题 2024. 考试的最大困扰度 (22.03.29)
Leetcode 每日一题 2024. 考试的最大困扰度 (22.03.29)
题目
一位老师正在出一场由 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’ 。
提示:
- n == answerKey.length
- 1 <= n <= 5 * 104
- answerKey[i] 要么是 ‘T’ ,要么是 ‘F’
- 1 <= k <= n
解题思路
思路:滑动窗口 参考:基本原理和实践
- 题目中k表示对字符串
answerKey
进行修改的最大可操作数,即将’F’改成’T’或’T’改成’F’的最大改动数,也可以认为是窗口里(‘FFF…F’)包含’T’或者(‘TT…T’)'F’的个数不超最大改动数k- 所以利用
t_sum、f_sum
表示窗口范围内T、F的数量,min(T_num,F_num)
为范围内数量较少改动数量。当min(t_sum , f_sum) > k
要判断左指针answerKey[left]
的值是否等 ‘T’或者’F’:
- 当
answerKey[left] == 'T'
时,t_sum -= 1, left += 1
,即左指针向后移动一位,反之f_sum -= 1,left +=1
- 最后当
min(t_sum , f_sum) = k
时,输出左右指针的位置差right - left +1
Python代码
class Solution:
def maxConsecutiveAnswers(self, answerKey: str, k: int) -> int:
t_sum , f_sum = 0,0 # t_sum、f_sum表示范围内T、F的数量
left = 0 # 左指针
for right , c in enumerate(answerKey): # 遍历字符串
t_sum += c == 'T'
f_sum += c == 'F'
if min(t_sum , f_sum) > k: # min(T_num,F_num)为范围内数量较少的答案,即改动数量
if answerKey[left] == 'T':
t_sum -= 1
else:
f_sum -= 1
left += 1
return right - left+1 # 最后算出最大连续数目
其它解题思路
作者:宫水三叶 《【宫水三叶】滑动窗口运用题》 (Java)
作者:Benhao 《 [Python/Java/JavaScript/Go] 双指针滑动窗口 》(Python)