一、前言
《JavaScript刷LeetCode拿offer-双指针技巧》中,简单地介绍了双指针技巧相比较单指针的优点,以及结合 Easy 难度的题目带大家进一步了解双指针的应用。
进入 Medium 难度之后,解题的关键在于如何构造双指针以及确定指针移动的规则,解题方法可以归纳为以下两类:
-
滑动窗口算法(Sliding Window Algorithm);
-
对数组进行预处理(如:排序,前缀和等等),再利用双指针遍历;
这两种方法都可以将双循环问题转化为单循环问题,从而有效地降低算法的时间复杂度。本篇主要介绍滑动窗口算法以及相关题型的解题思路,第二类题型会放在下一篇中讲解。
滑动窗口算法具体的表现形式为:左右指针始终维护一个满足条件的窗口值,右指针负责向前遍历,当窗口值不满足条件时,将左指针指向的元素移出窗口,同时向前移动左指针。
下面,结合实际的题目来理解如何使用滑动窗口算法。
二、567. 字符串的排列
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。
本道题目实际上可以转化为是否能找出满足以下条件的 s2 字符串的子串:
-
该子串的长度和 s1 字符串的长度相等;
-
该子串中包含的字符以及对应的数量和 s1 字符串相同