来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-the-confusion-of-an-exam

题目描述

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

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

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

示例 1:

输入:answerKey = "TTFF", k = 2
输出:4
解释:我们可以将两个 'F' 都变为 'T' ,得到 answerKey = "TTTT" 。
总共有四个连续的 'T' 。
示例 2:

输入:answerKey = "TFFT", k = 1
输出:3
解释:我们可以将最前面的 'T' 换成 'F' ,得到 answerKey = "FFFT" 。
或者,我们可以将第二个 'T' 换成 'F' ,得到 answerKey = "TFFF" 。
两种情况下,都有三个连续的 'F' 。
示例 3:

输入:answerKey = "TTFTTFTT", k = 1
输出:5
解释:我们可以将第一个 'F' 换成 'T' ,得到 answerKey = "TTTTTFTT" 。
或者我们可以将第二个 'F' 换成 'T' ,得到 answerKey = "TTFTTTTT" 。
两种情况下,都有五个连续的 'T' 。

提示:

n == answerKey.length
1 <= n <= 5 * 104
answerKey[i] 要么是 'T' ,要么是 'F'
1 <= k <= n

解题思路

看起来像个滑动窗口题,确实是滑动窗口,刚刚开始思路是记录TF的变化位置,以变化位置为起点分别求最长的长度,不过时间复杂度为O(n2)并且总漏掉几种情况,那就只能分类讨论了,修改可以将T修改为F,也可以将F修改为T,分两种情况,分别用滑动窗口求出最长长度,取最大值。

求最长的过程可以用一个滑动窗口,并且维护窗口中修改过的字符次数始终小于等于k。

代码展示

class Solution {
public: int myMax(string answerKey, int k, char c)
{
int iLeft = 0, iRight = 0, iSum = 0, iMax = 0;
while(iRight < answerKey.size())
{
if(answerKey[iRight] == c)
{
iRight++;
}
else
{
if(iSum < k)
{
iSum++;
iRight++;
}
else
{
if(answerKey[iLeft] != c)
{
iSum--;
}
iLeft++;
}
}
iMax = max(iMax, iRight - iLeft);
}
return iMax;
} int maxConsecutiveAnswers(string answerKey, int k) {
return max(myMax(answerKey, k, 'T'), myMax(answerKey, k, 'F'));
}
};

运行结果

最新文章

  1. 有意思的记录-python
  2. NodeJs:module.filename、__filename、__dirname、process.cwd()和require.main.filename
  3. Struts2之文件上传下载
  4. Apache Tomcat
  5. BZOJ2171——K凹凸序列
  6. iOS - 苹果健康架构 &amp; 基于HealthKit的健康数据的编辑
  7. 【Java基础】Java网络编程基础知识
  8. OC基础 类的三大特性
  9. iOS_SN_BlueTooth (二)iOS 连接外设的代码实现
  10. javac编译原理(一)
  11. Hive学习之更改表的属性
  12. zoj 1134 - Strategic Game
  13. C# MVC 自学笔记—2 MVC Movie简介
  14. hive 非等值连接, 设置hive为nonstrict模式
  15. dedecms中arclist标签做分页以及分页点击模块样式错乱问题
  16. Space Shooter 学习
  17. Distinct Substrings(spoj694)(sam(后缀自动机)||sa(后缀数组))
  18. 论述Android通过HttpURLConnection与HttpClient联网代理网关设置
  19. C++反汇编-菱形继承
  20. int.TryParse非预期执行引发的思考 ASP.NET -- WebForm -- 给图片添加水印标记 Windows -- 使用批处理文件.bat删除旧文件

热门文章

  1. VSCODE 中.art文件识别为html文件
  2. SQL语句查询关键字 多表查询
  3. Surp Suite入门
  4. 【转载】SQL 2012以上版本分页查询更简单
  5. [R语言] ggplot2入门笔记3—通用教程如何自定义ggplot2
  6. HBase详解(05) - HBase优化 整合Phoenix 集成Hive
  7. 基于WebSocket的实时消息传递设计
  8. MySQL之字段约束条件
  9. IO多路复用完全解析
  10. Stream流中的常用方法_skip-Stream流中的常用方法_concat