2024. 考試的最大困擾度
一位老師正在出一場由 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 * 10410^4104
- answerKey[i] 要么是 ‘T’ ,要么是 ‘F’
- 1 <= k <= n
解題思路
使用兩次滑動窗口
- 第一次維護窗口內T的數量,我們需要保證我們窗口內T的數量小于或者等于K,這樣才能保證窗口內的元素在不超過 k 次操作的情況下,可以保證全部轉化為F,每次嘗試擴大窗口,如果T的數量超出了K,我們需要縮小窗口,將原窗口內多余的T淘汰掉
- 第一次維護窗口內F的數量,操作與第一次相同。
代碼
class Solution {
public:int maxConsecutiveAnswers(string answerKey, int k) {int l=0,r=0,t=0,m=0;while (r<=answerKey.size()){while (t>k){if (l<r&&answerKey[l]=='T')t--;l++;}m=max(m,r-l);if (answerKey[r]=='T')t++;r++;}l=0,r=0,t=0;while (r<=answerKey.size()){while (t>k){if (l<r&&answerKey[l]=='F')t--;l++;}m=max(m,r-l);if (answerKey[r]=='F')t++;r++;}return m;}
};