0
点赞
收藏
分享

微信扫一扫

leetcode(力扣) 2024. 考试的最大困扰度 (滑动窗口)

惠特曼 2022-04-01 阅读 61

文章目录

题目描述

简化题目

给你一个字符串 里面都是‘T’或者‘F’,你可以将其中k个字符由T变成F 或者 由F变成T,使得F或T的连续个数最多。

思路分析

这题直接滑动窗口可以做,俩指针维护一个窗口,假设现在将F变成T,统计窗口中F的个数,只要不大于k个,就一直挪动右指针,否则挪动左指针直到窗口中的F的个数等于k,期间记录窗口长度最大值即可。

我们需要检测 T变成F的情况和F变成T的情况,取他俩的最大长度值。

拿示例3做个演示,题目所给:answerKey = “TTFTTFTT”, k = 1.

先考虑将F变成T的情况(即要找最长T的情况)。

  • 假设左右指针都指向0下标元素,此时为T,右指针后移。
  • 下标为1时也为T,右指针后移,下标为2时,变成F,计数器+1,但此时还未大于题目所给的k,所以继续后移。
  • 但移动到下标为5时,为F,计数器变成2,已经大于k了。
  • 这时将左指针向后移动,由0变成1,此时左指针所指依旧为T,并没有使得计数器小于k,继续后移。
  • 直到移动到下标为2指向了F,此时计数器减1,计数器变成1,等于k,再将左指针向后挪一个,让他指向下标为3的数(实际上就是略过了一个F,让窗口间的F的个数始终保持等于k)。

重复上述步骤并在期间记录窗口长度最大值,并且还要考虑将F变成T的情况。取两者最大值即可。

这种方法就是要考虑T变F和F变T的两种情况,这两种情况可以融合放在一起统计,我懒得写了,情况分开思路比较好理解,就用这个吧。

完整代码

class Solution:
    def maxConsecutiveAnswers(self, answerKey: str, k: int) -> int:
        def a(answerKey,k,ch):
            i = 0
            j = 0
            temp = 0
            res = 0
            while j < len(answerKey):
            # 统计要变的那个字符的个数
                if answerKey[j] == ch:
                    temp +=1
                # 超出可变个数
                while temp > k:
                	# 不断移动左指针直到窗口内的值在允许范围内
                    if answerKey[i] == ch:
                        temp -=1
                    i +=1
                res = max(res,j-i+1)
                j +=1
            print(res)
            return res
        # 判断两种情况,取最大的。
        res = max(a(answerKey,k,'T'),a(answerKey,k,'F'))
        return res
举报

相关推荐

0 条评论