带你读《图解算法小抄》二十、滑动窗口(4)

简介: 带你读《图解算法小抄》二十、滑动窗口(4)

带你读《图解算法小抄》二十、滑动窗口(3)https://developer.aliyun.com/article/1347998?groupCode=tech_library


3JavaScript解题框架:

下面是一个使用JavaScript实现滑动窗口算法解决最长无重复字符子串问题的框架代码:

 

function lengthOfLongestSubstring(s) {
    let maxLength = 0;
    let left = 0;
    let right = 0;
    let set = new Set();    while (right < s.length) {
        if (!set.has(s[right])) {
            set.add(s[right]);
            maxLength = Math.max(maxLength, right - left + 1);
            right++;
        } else {
            set.delete(s[left]);
            left++;
        }
}
    return maxLength;
}

 

在这个框架中,我们使用了leftright两个指针来构建窗口,set集合用于存储窗口内的字符。我们不断地向右移动right指针,如果遇到重复字符,则移动left指针来缩小窗口。在每次移动right指针时,都会更新最长子串的长度maxLength。最后,我们返回最长子串的长度作为结果。


5.最长重复字符替换


给定一个仅包含大写英文字母的字符串s和一个整数k,你可以对任何字符串中的字符进行最多k次替换。请你找出并返回替换后最长的重复字符子串的长度。

 

示例:

 

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

 

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

1题目分析与解题步骤:

为了解决这个问题,我们可以使用滑动窗口的方法。我们需要找出一个最长的窗口,这个窗口内部最多包含k个不同的字符。我们将这个窗口内的所有其他字符全部替换为出现次数最多的那个字符,就可以得到一个全是同一字符的字符串。

 

解题步骤如下:

 

  • 初始化两个指针left和right,都指向字符串的开始。
  • 不断地向右移动right指针,扩大窗口。每次移动时,记录当前窗口中出现次数最多的字符的数量。同时,如果right - left + 1(当前窗口的大小)减去出现次数最多的字符的数量大于k,说明不能通过替换得到全是同一字符的字符串,此时需要移动left指针,缩小窗口。
  • 每次移动right指针,都尝试用当前窗口的大小更新最长重复字符子串的长度。

下面是对应的JavaScript代码:

function characterReplacement(s, k) {
    let count = new Array(26).fill(0);
    let maxCount = 0, maxLength = 0;
    let left = 0, right = 0;    while (right < s.length) {
        count[s.charCodeAt(right) - 'A'.charCodeAt(0)]++;
        maxCount = Math.max(maxCount, count[s.charCodeAt(right) - 'A'.charCodeAt(0)]);        if (right - left + 1 - maxCount > k) {
            count[s.charCodeAt(left) - 'A'.charCodeAt(0)]--;
            left++;
        } else {
            maxLength = Math.max(maxLength, right - left + 1);
        }        right++;
}
    return maxLength;
}

 

在这段代码中,我们使用了一个数组count来记录每个字符的出现次数,maxCount来记录窗口中出现次数最多的字符的数量,maxLength来记录最长重复字符子串的长度。在每次移动right指针时,我们都会更新countmaxCount,并且如果当前窗口不能通过最多k次替换得到全是同一字符的字符串,我们就会移动left指针,缩小窗口。最后,返回的maxLength就是最长重复字符子串的长度。


带你读《图解算法小抄》二十、滑动窗口(5)https://developer.aliyun.com/article/1347995?groupCode=tech_library

相关文章
|
算法
【算法】滑动窗口——最大连续1的个数
【算法】滑动窗口——最大连续1的个数
152 0
|
9天前
|
存储 算法
算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。
|
6月前
|
机器学习/深度学习 监控 算法
员工上网行为监控软件中基于滑动窗口的C#流量统计算法解析​
在数字化办公环境中,员工上网行为监控软件需要高效处理海量网络请求数据,同时实时识别异常行为(如高频访问非工作网站)。传统的时间序列统计方法因计算复杂度过高,难以满足低延迟需求。本文将介绍一种基于滑动窗口的C#统计算法,通过动态时间窗口管理,实现高效的行为模式分析与流量计数。
175 2
|
4月前
|
存储 机器学习/深度学习 监控
公司电脑上网监控中滑动窗口算法的理论构建与工程实现
本文提出一种基于滑动窗口算法的实时网络流量监控框架,旨在强化企业信息安全防护体系。系统采用分层架构设计,包含数据采集、处理与分析决策三大模块,通过 Java 实现核心功能。利用滑动窗口技术动态分析流量模式,结合阈值检测与机器学习模型识别异常行为。实验表明,该方案在保证高检测准确率的同时支持大规模并发处理,为企业数字化转型提供可靠保障。
108 0
|
6月前
|
存储 机器学习/深度学习 监控
如何监控员工的电脑——基于滑动时间窗口的Java事件聚合算法实现探析​
在企业管理场景中,如何监控员工的电脑操作行为是一个涉及效率与合规性的重要课题。传统方法依赖日志采集或屏幕截图,但数据量庞大且实时性不足。本文提出一种基于滑动时间窗口的事件聚合算法,通过Java语言实现高效、低资源占用的监控逻辑,为如何监控员工的电脑提供一种轻量化解决方案。
154 3
|
7月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
180 3
|
算法
【算法】滑动窗口——最小覆盖子串
【算法】滑动窗口——最小覆盖子串
124 0
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
182 0
|
算法
【算法】滑动窗口——将x减到0的最小操作数
【算法】滑动窗口——将x减到0的最小操作数
134 0
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串

热门文章

最新文章