算法之滑动窗口

1.概念:

    滑动窗口:是一种基于双指针的一种思想 两个指针之间的元素形成一个窗口,通过左右指针不断移动去更新窗口中的数据。

算法之滑动窗口_第1张图片

2.模版

通过两个while循环 来不断更新窗口数据 开始时移动右指针并更新窗口数据 一旦窗口中的数据满足条件时 移动左指针并更新数据直到窗口中的数据不满足条件时 然后重复。

算法之滑动窗口_第2张图片

3.例题

点击跳转力扣

题解

#include

#include

#include

using namespace std;

vector findAnagrams(string s, string p) {

    // 创建哈希表,用于记录 p 中每个字符的出现次数

    unordered_map target;

    for (char c : p) {

        target[c]++;

    }

    // 创建哈希表,用于记录滑动窗口中每个字符的出现次数

    unordered_map window;

    // 定义滑动窗口的左右指针,以及结果数组

    int left = 0, right = 0;

    vector result;

    while (right < s.length()) {

        // 将窗口右侧的字符加入到 window

        window[s[right]]++;

        // 当窗口的长度等于 p 的长度时

        if (right - left + 1 == p.length()) {

            // 如果两个哈希相同,说明窗口内的字符串是 p 的一个异位词

            if (window == target) {

                result.push_back(left);

            }

            // 将窗口左侧的字符移出 window

            window[s[left]]--;

            if (window[s[left]] == 0) {

                window.erase(s[left]);

            }

            // 移动左指针

            left++;

        }

        // 移动右指针

        right++;

    }

    return result;

}

int main() {

    // 测试样例

    string s = "cbaebabacd";

    string p = "abc";

    vector indices = findAnagrams(s, p);

    for (int index : indices) {

        cout << index << " ";

    }

    cout << endl;

    return 0;

}

2.题:力扣         

题解:力扣

题:     力扣

题解:   力扣

你可能感兴趣的:(算法,数据结构,c++)