《算法零基础100学》(第1学)滑动窗口(一)

目录

一.滑动窗口的算法模板:

1.模板一:


一.滑动窗口的算法模板:

1.模板一:

#include <iostream>
#include <unordered_map>
using namespace std;
string minWindow(string s, string t) {
    // 记录最短子串的开始位置和长度
    int start = 0, minLen = INT_MAX;
    int left = 0, right = 0;

    unordered_map<char, int> window;
    /*首先unordered_map是一个将key和value关联起来的容器,
    它可以高效的根据单个key值查找对应的value.
    key值应该是唯一的,key和value的数据类型可以不相同。
    unordered_map存储元素时没有进行排序,只是根据key的哈希值,将元素存在指定位置,
    所以根据key查找单个value时非常高效,平均可以在常数时间内完成。
    unordered_map查询单个key的时候效率比map高,但是要查询某一范围内的key值时比map效率低。
    可以使用[]操作符来访问key值对应的value值。
    */
    unordered_map<char, int> needs;//默认值为0;
    for (char c : t) needs[c]++;
    /**相当于C++的:

    for (int i = 0; i < s.length(); i++)
    {
        s[i]....
    }*/
    int match = 0;

    while (right < s.size()) {
        char c1 = s[right];
        if (needs.count(c1)) {/*map和set两种容器的底层结构都是红黑树,
所以容器中不会出现相同的元素,因此count()的结果只能为0和1,
  可以以此来判断键值元素是否存在(当然也
可以使用find()方法判断键值是否存在)。*/
            window[c1]++;
            if (window[c1] == needs[c1])
                match++;
        }
        right++;

        while (match == needs.size()) {
            if (right - left < minLen) {
                // 更新最小子串的位置和长度
                start = left;//用star来标记最短字符串的位置,minlen则是它的长度
                minLen = right - left;
            }
            char c2 = s[left];
            if (needs.count(c2)) {
                window[c2]--;//c2个数--
                if (window[c2] < needs[c2])
                    match--;//匹配成功的字符数目减1;然后跳出循环
            }
            left++;//窗口继续向左滑动
        }
    }
    return minLen == INT_MAX ?
        "" : s.substr(start, minLen);
    /* string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,
    即不加参数会默认拷贝整个s)
异常 :若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,
则substr会调整n的值,只拷贝到string的末尾
*/
}

int main01() {
    string s, t;
    cin>>s>>t;
    string temp = minWindow(s, t);
    if (temp == "")    cout << "您要查找的子串不存在" << endl;
    else  cout << "包含目标字符串的最小子串为" << temp << endl;
    return 01;
}

借鉴资料:

【c++】STL 容器 unordered_map用法详解_炒扁豆的博客-CSDN博客_c++unordered_map用法这里对unordered_map进行一些简单的介绍,包括其基本用法。更加详细的介绍请学习cplusplus网站相关资料。1一、定义template < class Key, // unordered_map::key_type class T, ...https://blog.csdn.net/C2681595858/article/details/90576859

算法与数据结构(一):滑动窗口法总结_dby_freedom的博客-CSDN博客_滑动窗口法滑窗法在算法题中大量应用,其思想简洁强大,但是往往在维护左右指针时候容易出错,现总结整理如下:https://blog.csdn.net/Dby_freedom/article/details/89066140

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值