文章目录
题目描述
简化题目
给你一个字符串 里面都是‘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