解题记录:滑动窗口说明及应用

 

目录

什么是滑动窗口

滑动窗口的应用


什么是滑动窗口

滑动窗口,顾名思义,窗口在数组上滑动,从开始滑动到末尾,或者从你指定的地点往后滑到中间部分的另一个地点,这个窗口的大小可以自己定义。

如图:

滑动窗口的应用

能从一组长数组中找到你所需的短数组的位置,且这个位置不一定需要顺序相同

具体例题: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;
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shany-Ming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值