考试的最大困扰度

题目

一位老师正在出一场由 n 道判断题构成的考试,每道题的答案为 true (用 ‘T’ 表示)或者 false (用 ‘F’ 表示)。老师想增加学生对自己做出答案的不确定性,方法是 最大化 有 连续相同 结果的题数。(也就是连续出现 true 或者连续出现 false)。

给你一个字符串 answerKey ,其中 answerKey[i] 是第 i 个问题的正确结果。除此以外,还给你一个整数 k ,表示你能进行以下操作的最多次数:

每次操作中,将问题的正确答案改为 ‘T’ 或者 ‘F’ (也就是将 answerKey[i] 改为 ‘T’ 或者 ‘F’ )。
请你返回在不超过 k 次操作的情况下,最大 连续 ‘T’ 或者 ‘F’ 的数目。

链接:https://leetcode-cn.com/problems/maximize-the-confusion-of-an-exam

思路

滑动窗口,右指针保证数目最大,左指针保证符合条件

代码

方法一

class Solution {
public:
    int maxConsecutiveAnswers(string answerKey, int k) {

        int slow=0;
        int ans=0;
        int n=answerKey.size();

        int t=0;
        int f=0;

        for(int fast=0;fast<n;fast++){

            if(answerKey[fast] == 'T') t++;
            else  f++;

            while(t>k&&f>k){

                if(answerKey[slow]=='T') t--;
                else f--;
                slow++;
            }

            ans=max(ans,fast-slow+1);

        }

        return ans;
        
    }
};

方法二

class Solution {
public:
    int maxConsecutiveAnswers(string answerKey, int k) {

        return max(maxlen(answerKey,k,'T'),maxlen(answerKey,k,'F'));
        
    }

    int maxlen(string answerKey,int k,char ch){

        int n=answerKey.size();

        int ans=0;

        for(int left=0,right=0,sum=0;right<n;right++){

            if(answerKey[right]!= ch)  sum++;

            while(sum>k){
                if(answerKey[left]!=ch) sum--;
                left++;
            }

            ans=max(ans,right-left+1);

        }

        return ans;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值