LeetCode 2024.考试的最大困扰度

LeetCode 2024.考试的最大困扰度

2024. 考试的最大困扰度

### [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HsK5w0Nr-1648549106328)(../OS/image-20220329171427223.png)]

方法一 : dp;

在这里插入图片描述

对字符串进行循环遍历:

**当idx <= k 时 : **
a n s = i + 1 ans = i+1 ans=i+1
当idx > k 时 不难得出 当前字符串的长度为i-f[idx-k-1]
a n s = m a x ( a n s , i − f [ i d x − k − 1 ] ) ans = max(ans,i-f[idx-k-1]) ans=max(ans,if[idxk1])

class Solution {
    public  int maxConsecutiveAnswers(String answerKey, int k) {
        char[] arr = answerKey.toCharArray();
        return Math.max(getMax(arr,k,'T'),getMax(arr,k,'F'));
    }
    static int getMax(char[] arr ,int k,char ch){
        int idx = 0,ans = 0;
        int n  = arr.length;
        int f[] = new int[n];
        for(int i = 0 ; i <  n ; i ++){
            if(arr[i] == ch)    f[idx++] = i;
            if(idx<=k)  ans=i+1;
            else {
                ans  =  Math.max(ans,i-f[idx-k-1]);
            }
        }
        return ans;
    }
}

//  f[i]  =  f[i-1]
方法二:滑动窗口

l 为窗口的左端 , r 为窗口的右端,cnt记录 [l,r] 区间内查询T或F的数量

1)当cnt <= k 时 , r 可以一直右走 同时 记录ans
a n s = m a x ( a n s , r − l + 1 ) ans = max(ans,r-l+1) ans=max(ans,rl+1)
2)当cnt > k 时, l 往右走缩紧区间,直到cnt <= k

class Solution {
    public  int maxConsecutiveAnswers(String answerKey, int k) {
        char[] arr = answerKey.toCharArray();
        int n = arr.length;
        int cnt = 0, l = 0 ,  r = 0 , ans = 0;
        char ch = 'F';
        while( r < n ){ //  search for F
            cnt += arr[r] == ch ? 1:0;
            while(cnt > k){
                cnt -= arr[l++] == ch?1:0;
            }
            ans = Math.max(ans,r - l + 1);
            r++;
        }
        ch = 'T'; cnt  = 0; l = 0; r = 0;
        while( r < n ){ //  search for T
            cnt += arr[r] == ch ? 1:0;
            while(cnt > k){
                cnt -= arr[l++] == ch?1:0;
            }
            ans = Math.max(ans,r - l + 1);
            r++;
        }
        return ans;
    }
}

//  f[i]  =  f[i-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渝北最后的单纯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值