【算法攻坚】滑动窗口算法初探

简介: 【算法攻坚】滑动窗口算法初探

题目


给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。


示例 1:


输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。


示例 2:


输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。


示例 3:


输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。


请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 示例 4:

输入: s = "" 输出: 0


思路


这道题难度是中等,我觉得挺难的,如果没接触过,估计很难在较低的算法复杂度下做出来,


主要考察滑动窗口算法


听起来“滑动窗口”很牛逼,其实就是类似双指针,

在两个指针之内的是符合条件的元素

如果遇到不符合条件得元素则两个指针向右移动,剔除最左边元素

比如abc是一个窗口,当再遇到a时,窗口内变成bca

代码实现如下,算法复杂度为O(n2)

public static int lengthOfLongestSubstring2(String s) {
    int result = 0;
    if (s.length() == 0) {
        return result;
    }
    int len = 0;
    int start = 0;
    for (int end = 0; end < s.length(); end++) {
        char cur = s.charAt(end);
        //判断前面循环过的是否包含当前的字符
        for (int i = 0; i < end; i++) {
            //如果包含,跳过第一次出现的位置,从之后位置计算
            if (s.charAt(i) == cur) {
                start = i + 1;
                len = end - start;
                break;
            }
        }
        result = Math.max(result, ++len);
    }
    return result;
}


优化


上面实现的方案,在判断当前字符是否出现过时每次都是从前面遍历过数据中再次遍历

这种效率肯定不高,所以考虑通过hash表进行优化

public static int lengthOfLongestSubstring(String s) {
    int result = 0;
    if (s.length() == 0) {
        return result;
    }
    // 用map保存元素的位置,如果下一个字符在map中出现过
    // 证明窗口需要左移,窗口左指针为map中重复元素的下一个
    Map<Character, Integer> char2index = new HashMap<>();
    //start,end左右指针组成滑动窗口
    for (int start = 0, end = 0; end < s.length(); end++) {
        char element = s.charAt(end);
        if (char2index.containsKey(element)) {
            //char2index.get()的地方进行+1操作 ,此处是重点
            start = Math.max(char2index.get(element) + 1, start);
        }
        result = Math.max(result, end - start + 1);
        char2index.put(element, end);
    }
    return result;
}


小结


滑动窗口的相关的题目还是很有规律可循的,明天争取抽个时间,对滑动窗口的题目做个总结与归纳,把相关题目梳理一遍。


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

热门文章

最新文章