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

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

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

 

6.判断字符串排列


给定两个字符串s1和s2,判断s2是否包含s1的任意排列。如果是,返回true;否则,返回false。

 

示例:

 

输入:s1 = "ab",s2 = "eidbaooo" 输出:true 解释:s2 包含 s1 的一个排列("ba")。

 

输入:s1 = "ab",s2 = "eidboaoo" 输出:false 解释:s2 并不包含 s1 的任意排列。

1题目分析与解题步骤:

这个问题可以使用滑动窗口算法来解决。我们可以维护一个窗口,大小等于s1的长度,在s2上滑动窗口,并比较窗口内的字符是否与s1中的字符构成相同的排列。

 

解题步骤如下:

 

  • 初始化两个计数器对象counter1和counter2,用于记录s1和当前窗口内字符的出现次数。
  • 遍历字符串s1,并统计每个字符的出现次数,存储在counter1中。
  • 初始化两个指针left和right,分别指向窗口的左右边界。
  • 在s2上使用滑动窗口,开始从左向右滑动窗口。
  • 在每次滑动窗口时,更新窗口内字符的出现次数counter2。同时,比较counter1和counter2是否相等,如果相等,表示当前窗口内的字符与s1中的字符构成相同的排列。
  • 如果相等,返回true。
  • 如果不相等,继续滑动窗口,即将窗口的左边界向右移动一位,并更新counter2。
  • 重复步骤5-7,直到窗口滑动到s2的末尾。
  • 如果未找到符合条件的排列,返回false。

2JavaScript解题框架:

function checkInclusion(s1, s2) {
    let counter1 = {};
    let counter2 = {};    // 统计 s1 中字符的出现次数
    for (let char of s1) {
        counter1[char] = (counter1[char] || 0) + 1;
    }    let left = 0;
let right = 0;
    while (right < s2.length) {
        // 扩大窗口
        let char = s2[right];
        counter2[char] = (counter2[char] || 0) + 1;        // 检查窗口内字符的出现次数是否与 s1 相同
        if (right - left + 1 === s1.length) {
            if (compareCounters(counter1, counter2)) {
                return true;
            }
            // 缩小窗口
            char = s2[left];
            counter2[char]--;
            if (counter2[char] === 0) {
                delete counter2[char];
            }
            left++;
        }
        right++;
}
    return false;
}
// 比较两个计数器对象的键值对是否相等function compareCounters(counter1, counter2) {
    for (let key in counter1) {
        if (counter1[key] !== counter2[key]) {
            return false;
        }
    }
return true;
}

 

在这个框架中,我们使用了两个计数器对象counter1counter2,分别用于统计s1和窗口内字符的出现次数。

 

我们首先遍历s1,统计每个字符的出现次数,存储在counter1中。然后,使用滑动窗口在s2上进行匹配。在每次滑动窗口时,我们将当前字符的出现次数添加到counter2中,并与counter1进行比较。如果两个计数器对象的键值对相等,则表示当前窗口内的字符与s1中的字符构成相同的排列。

 

最后,如果找到符合条件的排列,返回true;否则,返回false。

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