滑动窗口<==>java

滑动窗口(Sliding Window)是一种用于解决字符串或数组相关问题的算法技巧。它通过维护一个窗口,该窗口在数据结构上可以是一个固定大小的窗口或可变大小的窗口,然后在数据结构中滑动窗口的起始位置或结束位置来解决问题。

滑动窗口算法通常适用于以下类型的问题:

  1. 子串或子数组问题:找到最长的连续子串或子数组,使其满足某种条件。
  2. 字符或数字的频率问题:统计在给定窗口范围内字符或数字的出现频率或数量。

滑动窗口算法的核心思想是通过调整窗口的起始位置和结束位置,来有效地缩小问题的搜索空间。它通过移动窗口的方式,每次处理一个新的元素或字符,以获得所需的结果。

具体步骤如下:

  1. 初始化窗口的起始位置和结束位置。
  2. 开始遍历字符串或数组,并根据问题要求进行相应的操作。
  3. 当满足窗口的某种条件时,更新结果或记录信息。
  4. 移动窗口的起始位置或结束位置,以调整窗口大小。
  5. 重复步骤2到4,直到遍历完整个字符串或数组。

滑动窗口算法常常可以在O(n)的时间复杂度内解决问题,因为每个元素或字符至多被处理两次(进入窗口和离开窗口),而不需要对每个元素进行全局搜索。

滑动窗口是一种高效且常用的算法技巧,可以应用于多种问题中,特别适用于子串或子数组问题以及频率统计问题。

例如:较为经典的一道算法题目:

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

JAVA代码实现:

import java.util.HashMap;

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        int maxLen = 0;
        int start = 0;
        HashMap<Character, Integer> map = new HashMap<>();
        
        for (int end = 0; end < n; end++) {
            char c = s.charAt(end);
            if (map.containsKey(c) && map.get(c) >= start) {
                start = map.get(c) + 1;
            }
            map.put(c, end);
            maxLen = Math.max(maxLen, end - start + 1);
        }
        
        return maxLen;
    }
}

猜你喜欢

转载自blog.csdn.net/monicateacat/article/details/132875438