目录
什么是滑动窗口
滑动窗口,顾名思义,窗口在数组上滑动,从开始滑动到末尾,或者从你指定的地点往后滑到中间部分的另一个地点,这个窗口的大小可以自己定义。
如图:
滑动窗口的应用
能从一组长数组中找到你所需的短数组的位置,且这个位置不一定需要顺序相同
具体例题:438. 找到字符串中所有字母异位词 - 力扣(LeetCode) (leetcode-cn.com)
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例:
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
当时第一眼看到这道题的时,想到的是滑动窗口与元素相加,只要窗口内元素的和与另一个数组元素的和一致便可,但随即又发现了问题,那就是a+b与e+f的值是一样的,诸如类似的有很多,所以这个方法是行不通的,那么只能滑动窗口和字母表进行解决。
题解:
int* findAnagrams(char * s, char * p, int* returnSize){
int num1 = strlen(p), num2 = strlen(s), i = 0, j = 0, count = 0, size = 0;
int* fin =(int*) malloc(num2 * sizeof(int));
int c[26] = { 0 };//记录短数组
int d[26] = { 0 };//记录长数组
for (i = 0; i < num1; i++)
{
c[p[i] - 'a'] += 1;//将短数组中与字母对应的位置处做+1记号
}
for (i = 0; i <=num2 - num1; i++)
{
count = 0;//记录相同元素的个数,每滑动一次count清0
for (j = 0; j < num1; j++)
{
d[s[i + j] - 'a'] += 1;//将长数组中与字母对应的位置处做+1记号
}
for (j = 0; j < 26; j++)
{
if (c[j] == d[j])
{
count++;
}
}
if (count == 26)
{
fin[size] = i;
size++;
}
for (j = 0; j < 26; j++)//滑动一次过后需要将记录长数组的数组清零
{
d[j] = 0;
}
}
*returnSize=size;
return fin;
}