重复次数最多的 子串_每日算法系列【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;然后…

VS2015 python

http://pgqlife.info/2015/05/05/VS-Python/ 配置文档转载于:https://www.cnblogs.com/itdef/p/5262712.html

了解Java弱引用

我最近没来得及关注该博客&#xff0c;最重要的是&#xff0c;我没有为与技术界的所有人保持联系而致歉。 我最近偶然发现了Java 1.2以来提供的java.lang.ref包&#xff0c;但具有讽刺意味的是&#xff0c;几天前我才知道它。 在浏览了几篇有关各种引用类型和java doc的文章时&…

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;但这…

查找出系统中大于50k 且小于100k 的文件并删除。

查找出系统中大于50k 且小于100k 的文件并删除。 [rootxusx xxx]# ll -lhtotal 624K-rw-r--r-- 1 root root 576K Nov 30 21:39 1.txt-rw-r--r-- 1 root root 48K Nov 30 21:40 2.txt [rootxusx xxx]# find ./ -type f -size 1k -a -size -100k ./2.txt 转载于:https://www.cnb…

vb.net mysql存储图片_怎么让VB.NET 上传图片到SQL 数据库只保存路径,图片保存到文件...

我的前台代码dimCoonAsSqlClient.SqlConnectiondimRsAsNewSqlClient.SqlCommandRs.ConnectionCoonRsNewSqlClient.SqlCommand("上传图片",Coon)Rs.CommandTypeCommandType.StoredPr...我的前台代码 dim Coon As SqlClient.SqlConnection dim Rs As New SqlClient.Sql…

[国嵌攻略][132][串口驱动实现]

如何开发Linux驱动程序 一般情况下都会有现成的驱动程序&#xff0c;不需要从零开始开发驱动程序。所以Linux驱动开发主要分为两个步骤&#xff1a;1.读得懂驱动程序&#xff1b;2.写的了核心功能。 发送中断处理程序 发送中断处理函数在/drivers/serial/samsung.c的s3c24xx_se…

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

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

[转] vim自定义配置 和 在ubnetu中安装vim

Ubuntu 12.04安装vim和配置 问题&#xff1a; ubuntu默认没有安装vim&#xff0c;出现&#xff1a; jygubuntu:~$ vim test.cThe program vim can be found in the following packages: * vim * vim-gnome * vim-tiny * vim-athena * vim-gtk * vim-noxTry: sudo apt-get insta…

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…

(15) PHP 随笔---LAMP Linux基本操作 对文件、目录的操作

◇对目录的操作&#xff1a; ◇创建目录&#xff1a; mkdir Xmu //在当前目录下创建一个名为Xmu的目录 ◇创建多个级别目录关系&#xff1a; mkdir -p newdir/newdir/newdir //在当前目录下创建多个连续目录&#xff0c;-p的意思是以递归的方式 ◇移动目录(也可以针对…

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

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

hmcl手机版下载_最新HMCL下载地址

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼[16:49:27][AWT-EventQueue-0/ERROR]---- Hello Minecraft! Crash Report ----Version: 2.3.1Time: 2016-7-14Thread: Thread[AWT-EventQueue-0,6,main]Advice:无建议。Content:java.lang.IllegalStateException: Buffers have not…

为什么我会在2012年的新企业Java项目中使用Java EE而不是Spring

这个问题经常出现。 我的新项目也在2011年11月发布。 在这个新的Enterprise Java项目中&#xff0c;我将使用Java EE&#xff08;JEE&#xff09;代替Spring框架。 我知道&#xff1a;关于此主题的文章&#xff0c;博客和论坛讨论都可以找到。 为什么还需要一个&#xff1f; 因…

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

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

遥感影像滤波处理软件 — timesat3.2

最近因为要做遥感影像的滤波处理&#xff0c;经过女神推荐&#xff0c;决定用Timesat&#xff0c;可是该软件3.1版本只适合xp系统以及2011的matlab&#xff0c;后来在官网上找到了最新的3.2版本。支持64位操作系统以及2014的matlab。大家可以直接上官网&#xff08;http://www.…

持久化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规范所替代&…

WebSphere Classloader内存泄漏预防

解决应用程序类加载器泄漏 应用领域 倾向于&#xff1a; 使用应用程序类加载器中的Runnable实现启动新线程。 即使JEE编程模型不支持此功能&#xff0c;客户也经常直接创建新线程或通过使用间接创建它们 计时器 客户必须确保在停止相应的应用程序&#xff08;或WAR模块&…