力扣每日一题2024

110 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

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

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

链接:leetcode-cn.com/problems/ma…

解题思路

题目要求最大的连续的'T'或者'F'的数目。容易联想到使用滑动窗口的思想解决问题。初始想法是根据k值,动态更改原字符串中的字符,但是会影响后续计算。因此改进该思路,并不真正更改字符串,而是假想可以更改。由于每次操作可以改变T或者F的值,因此,可以统计在滑动窗口中不超过k次的T或者F的值,最后取两者中的最大值,即为最终结果。

AC代码
class Solution {
    public int maxConsecutiveAnswers(String answerKey, int k) {
       return Math.max(getCnt(answerKey, 'T', k), getCnt(answerKey, 'F', k));
    }

    private int getCnt(String answerKey, char ch, int k){
        int ans = 0;
        for(int i=0, j=0, cnt = 0; i < answerKey.length(); i++){
            if(answerKey.charAt(i) == ch) cnt++;
            while(cnt > k){
                if(answerKey.charAt(j) == ch) cnt--;
                j++;
            }
            ans = Math.max(ans, i - j + 1);
        }
        return ans;
    }
}
总结

在碰到求连续的一段字符的个数等一类问题时,可以考虑滑动窗口方法。滑动窗口的主要思想是使用两个指针start, end标记窗口的范围,当end不满足条件时,更新start指针的位置,直至重新满足滑动窗口的条件。注意更新start时,同时注意移除左侧窗口,对窗口元素的影响。