重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

64025387901a23490b9bdec4ddf68fe5.png

题目描述

给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。

示例1

输入:
s = "ABAB", k = 2
输出:
4
解释:
用两个'A'替换为两个'B',反之亦然。

示例2

输入:
s = "AABABBA", k = 1
输出:
4
解释:
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4。

提示 字符串长度和 k 不会超过 10^4。

题解

这题和之前做过的一题非常类似:

godweiyang:每日算法系列【LeetCode 1004】最大连续1的个数 III​zhuanlan.zhihu.com
e9c73e779f0fadb7f7c98897147912e9.png

只不过这题字符数量变成了 26 个。

方法和那题类似,都是用滑动窗口。用数组 count 记录每个字母出现的次数,并且用变量 cmax 记录窗口中出现次数最多的字母数量。

当前窗口是 [l, r] ,如果保留窗口中出现次数最多的字母,将其他字母全部替换为这个字母,那么替换次数就是

equation?tex=r+-+l+%2B+1+-+cmax 。如果它大于 k ,那就说明不能继续向右扩展,而是需要左端点右移,缩小窗口了。缩小的过程中时刻更新 cmax 的值就行了,直到
equation?tex=r+-+l+%2B+1+-+cmax 再次小于等于 k ,然后继续右移 r 。

代码

c++

class Solution {
public:int characterReplacement(string s, int k) {int n = s.size();vector<int> count(26, 0);int l = 0, r = 0, cmax = 0, res = 0;while (r < n) {cmax = max(cmax, ++count[s[r]-'A']);while (r - l + 1 - cmax > k)count[s[l++]-'A']--;res = max(res, r - l + 1);r++;}return res;}
};

python

class Solution:def characterReplacement(self, s: str, k: int) -> int:n = len(s)count = [0] * 26l, r, cmax, res = 0, 0, 0, 0while r < n:count[ord(s[r])-ord('A')] += 1cmax = max(cmax, count[ord(s[r])-ord('A')])while r - l + 1 - cmax > k:count[ord(s[l])-ord('A')] -= 1l += 1res = max(res, r - l + 1)r += 1return res

后记

注意这里代码实现上面有个很大的问题,就是右移左端点缩小窗口的时候, cmax 并没有跟着减小,这样为什么还是对的呢?这种情况下, cmax保存的其实是历史出现次数最多的字母的次数。而你不改变 cmax ,就会导致中间过程中出现很多不符合题意的窗口,也就是实际要修改的数量大于 k 的窗口,但是因为你 cmax 偏大,算下来修改数量偏小,它又是符合题意的。不过不影响,这些错误的窗口的长度一定是小于你之前算到的正确窗口的长度的(如果大于了,那么 cmax 一定会被更新)。

下面解释来自于algsCG:

因为我们只对最长有效的子字符串感兴趣,所以我们的滑动窗口不需要收缩,即使窗口可能覆盖无效的子字符串。我们可以通过在右边添加一个字符来扩展窗口,或者将整个窗口向右边移动一个字符。而且我们只在新字符的计数超过历史最大计数(来自覆盖有效子字符串的前一个窗口)时才增长窗口。也就是说,我们不需要精确的当前窗口的最大计数;我们只关心最大计数是否超过历史最大计数;这只会因为新字符而发生。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础(一)简单入门

一.第一个python程序 1.交互式编程 直接在命令行里面输入python即可进入python交互式命令行&#xff0c;linux下一样&#xff1a; 在 python 提示符中输入以下文本信息&#xff0c;然后按 Enter 键查看运行效果&#xff1a; 2.脚本式编程 把代码都写到文件里面&#xff0c;然后…

unbuntu 启动任务脚本_Ubuntu下服务启动脚本编写

像Nginx、MySQL等服务一样&#xff0c;在后台运行自己编写的抓取天气信息的Python脚本。1.以管理员权限新建一个服务脚本文件sudo vim /etc/init.d/weather_service2.用下列模板修改该服务脚本文件#!/bin/bash### BEGIN INIT INFO## Provides: weather_service# Required-Start…

iOS开发工具——网络封包分析工具Charles

作者 唐巧 发布于 2013年12月9日 | 1 讨论 分享到&#xff1a;微博微信FacebookTwitter有道云笔记邮件分享稍后阅读我的阅读清单简介 Charles是在Mac下常用的截取网络封包的工具&#xff0c;在做iOS开发时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要…

Java Web托管选项流程图

我经常被问到的一个问题是在何处以及如何托管Java Web应用程序。 可以在带有嵌入式服务器的Eclipse中创建它很好&#xff0c;但是如何将它带给人们呢&#xff1f; 长期以来&#xff0c;对于发烧友的程序员一直没有答案。 只有昂贵和超大型的选择。 事情最近变了&#xff0c;但这…

使用Regions ADF 11g进行Master Detail CRUD操作

你好 此示例演示了如何使用Regions在表之间创建Master Detail关系。 区域的主要目的是可重用性的概念。 使用区域和有限的任务流&#xff0c;我们可以将页面重用到许多其他页面中&#xff0c;以保持相同的功能并采用更简洁的方法。 下载示例应用程序。 在此示例中&#xff0c;…

win7 mysql php apache myadmin_windows下Apache+mysql+php+phpMyAdmin的安装及配置 | 学步园

1、下载Apache ( httpd-2.2.25-win32-x86-no_ssl.msi )http://httpd.apache.org/download.cgi#apache24根据提示安装到路径(建议自定义路径)&#xff0c;NetWork Domain和Server Name都输入 localhost(访问时使用的域名);2、下载mysql (mysql-5.5.34-win32.msi )http://dev.m…

具有NetBeans,嵌入式GlassFish,JPA和MySQL数据源的Arquillian

这是一个偶然的帖子。 我一直在研究交易CDI观察者&#xff0c;并尝试使用嵌入式GlassFish对它进行一些集成测试。 但是令人惊讶的是&#xff0c;这种方法不能很好地工作&#xff0c;我仍在弄清楚&#xff0c;使用普通的嵌入式GlassFish时问题出在哪里。 同时&#xff0c;我转到…

jsp mysql 音乐网站_Maven+JSP+SSM+Mysql实现的音乐网站

项目简介本系统基于MavenJSPSSMMysql实现的音乐网站。主要实现的功能有音乐播放、下载、上传等几个模块。难度等级&#xff1a;中等技术栈编辑器Eclipse Version: 2020-03 (4.15.0)前端技术基础&#xff1a;htmlcssJavaScript框架&#xff1a;JQueryBootstrap后端技术SpringSpr…

持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接

在EJB 2.x中。EJB有3种类型的Bean。各自是会话Bean&#xff08;Session Bean&#xff09;、消息驱动Bean&#xff08;Message-Driven Bean&#xff09;和实体Bean&#xff08;Entity Bean&#xff09;。 随着EJB 3的推出&#xff0c;EJB2.x中的实体Bean逐渐被JPA规范所替代&…

【SAP业务模式】之ICS(四):组织单元的配置

SAP的ICS业务后台配置主要有以下几个配置点&#xff1a; 1、组织单元的配置&#xff08;公司代码、销售组织、工厂、采购组织等&#xff09;&#xff1b; 2、主数据的部分&#xff1b; 3、订单和开票的定价过程&#xff1b; 4、开票输出类型&#xff1b; 5、公司间发票的配置&a…

Twitter4j和Esper:在Twitter上跟踪用户情绪

对于复杂事件处理和Twitter API的新手&#xff0c;我希望这是一个简短的教程&#xff0c;可以帮助他们Swift起步。 管理大数据并从中挖掘有用的信息是当前技术中最热门的讨论主题。 来自Twitter&#xff0c;Facebook和Linkedin等社交网络的半结构化数据的爆炸式增长使Hadoop&am…

webase crud查看所有表_Laravel-Gii 可视化代码生成工具 CRUD +GUI

Laravel-Gii 可视化代码生成工具 CRUD GUI适用于快速B端后台开发&#xff0c;根据MySQL的表结构生成对应的Model、Observer、Controller、View、Route等相关项目文件[TOC]注意因为是解析MySQL的表结构&#xff0c;并且根据字段生成模板&#xff0c;所以目前生成的Model类时只支…

20145231第二周Java学习笔记

20145231 《Java程序设计》第2周学习总结 教材学习内容总结 本周的学习采用的依然是先看课本&#xff0c;再看视频&#xff0c;然后实践敲代码&#xff0c;最后根据学习笔记总结完成博客。 第三章&#xff1a;基础语法 知识点比较多比较零碎&#xff0c;整理的都是实际操作中可…

JavaFX 2.0和Scala,像牛奶和饼干

JavaFX 2.0和Scala都是很好的技术&#xff0c;但是一起使用时效果会更好。 JavaFX 2.0是一种功能强大的富客户端技术&#xff0c;具有先进的图形&#xff0c;动画和媒体功能。 Scala是一种简单但功能强大的语言&#xff0c;具有用于编写特定于域的语言&#xff08;DSL&#xff…

ASP.NET WebAPi之断点续传下载(上)

前言 之前一直感觉断点续传比较神秘&#xff0c;于是想去一探究竟&#xff0c;不知从何入手&#xff0c;以为就写写逻辑就行&#xff0c;结果搜索一番&#xff0c;还得了解相关http协议知识&#xff0c;又花了许久功夫去看http协议中有关断点续传知识&#xff0c;有时候发觉东西…

贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

程序效果&#xff1a; 代码&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

python中sorted的用法append_python sorted()排序详解

排序&#xff0c;在编程中经常遇到的算法&#xff0c;我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用内置函数sorted()/list.sort()的使用简单应用python对list有一个内置函数&#xff1a;>>> a[5…

云上的播放框架变得简单:Openshift模块

仅仅几年前&#xff0c;找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务&#xff0c;而寻找免费的托管解决方案是一项不可能的任务。 更不用说甚至考虑自动缩放&#xff0c;单命令部署&#xff0c;持续集成等事情&#xff0c;这都是科幻小说。 去年见证了云计…

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine&#xff08;协程&#xff09; 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件&#xff0c; Image&#xff1a; 将以下代码绑定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动

前言&#xff1a;之前我有写过CSS3的transform这一这特性&#xff0c;对于它的用法&#xff0c;还不是很透彻&#xff0c;今天补充补充&#xff0c;呵呵 你懂的&#xff0c;小司机准备开车了。 a)再提一提transform的四个属性 ①旋转--->rotate(参数a)&#xff0c;单位deg&a…