牛客网235698题:用滑动窗口寻找最多包含两种字符的最长子串

深度学习
• 阅读 8

牛客网235698题:用滑动窗口寻找最多包含两种字符的最长子串

一、什么是滑动窗口算法

滑动窗口算法是一种用于处理数组/字符串子区间问题的优化技术。它通过维护一个窗口(通常是子数组或子字符串),在遍历过程中动态调整窗口的边界,从而高效地解决问题。

二、算法核心思想

  1. ‌初始化窗口‌:通常从数组/字符串的起始位置开始
  2. ‌扩展窗口‌:移动右边界,扩大窗口范围
  3. ‌收缩窗口‌:当窗口不满足条件时,移动左边界缩小窗口
  4. ‌更新结果‌:在每次窗口调整后,检查是否需要更新最优解

三、完整代码

#include <iostream>
#include <string>
#include <unordered_map>
using namespACe std;

int longestSubstring(string s) {
    unordered_map<char, int> charCount; // 记录窗口中字符出现次数
    int left = 0, maxLen = 0; // 窗口左边界和最大长度

    for (int right = 0; right < s.size(); ++right) {
        charCount[s[right]]++; // 扩展右边界,增加当前字符计数

        // 当窗口内字符种类超过2时,移动左边界
        while (charCount.size() > 2) {
            charCount[s[left]]--; // 减少左边界字符计数
            if (charCount[s[left]] == 0) {
                charCount.erase(s[left]); // 如果计数为0,从哈希表中移除
            }
            left++; // 移动左边界
        }

        // 更新最大长度
        maxLen = max(maxLen, right - left + 1);
    }

    return maxLen;
}

int main() {
    string s;
    cin >> s;
    cout << longestSubstring(s) << endl;
    return 0;
}

四、代码解析

  1. ‌哈希表的使用‌:我们使用unordered_map来记录窗口中每个字符的出现次数
  2. 双指针技巧‌:leftright指针分别表示窗口的左右边界
  3. ‌窗口调整逻辑‌:
    • 当哈希表中记录的字符种类超过2时,移动左指针
    • 每次移动左指针时,减少对应字符的计数
    • 如果字符计数减到0,从哈希表中移除该字符

五、总结

滑动窗口算法是解决子区间问题的利器,通过双指针和哈希表的配合,能够高效地处理字符串和数组问题。掌握这种算法不仅能帮助我们解决面试题,也能在实际开发中优化许多数据处理场景。

来源:编程学习

点赞
收藏
评论区
推荐文章
阮小五 阮小五
2年前
BetterSnapTool for Mac 帮你整理窗口,提升效率
每个人都有自己用着顺手的窗口布局。BetterSnapToolforMac可以通过拖放、点按或快捷键,迅速把窗口调整到你喜欢的位置,助你提升效率。推荐理由:《BetterSnapTool》调整窗口位置的方式很灵活。你可以把窗口拖放到屏幕顶部、左侧或右侧边缘
仲远 仲远
2年前
Rectangle Pro for Mac(窗口布局增强工具) 3.0激活版
RectanglePro是一款Mac上的窗口管理工具,它可以帮助用户更加高效地管理和布局窗口。用户可以通过快捷键或者鼠标手势来实现窗口的调整和布局,包括窗口的移动、调整大小、屏幕分割等操作。此外,RectanglePro还支持多显示器,可以将窗口在多个显示
小尉迟 小尉迟
2年前
BetterSnapTool for Mac 帮你整理窗口,提升效率
每个人都有自己用着顺手的窗口布局。BetterSnapToolforMac可以通过拖放、点按或快捷键,迅速把窗口调整到你喜欢的位置,助你提升效率。推荐理由:《BetterSnapTool》调整窗口位置的方式很灵活。你可以把窗口拖放到屏幕顶部、左侧或右侧边缘
布袋罗汉 布袋罗汉
2年前
Rectangle Pro for Mac(窗口布局增强工具)
RectanglePro是一款Mac上的窗口管理工具,它可以帮助用户更加高效地管理和布局窗口。用户可以通过快捷键或者鼠标手势来实现窗口的调整和布局,包括窗口的移动、调整大小、屏幕分割等操作。此外,RectanglePro还支持多显示器,可以将窗口在多个显示
腾讯T2亲自讲解!Android-App的设计架构经验谈
正文我们今天将说明以下14种模式:1.滑动窗口2.二指针或迭代器3.快速和慢速指针或迭代器4.合并区间5.循环排序6.原地反转链表7.树的宽度优先搜索(TreeBFS)8.树的深度优先搜索(TreeDFS)9.TwoHeaps10.子集11.经过修改的二叉搜索12.前K个元素13.K路合并14.拓扑排序我们开始吧!1.滑动窗口滑动窗口模式
Wesley13 Wesley13
3年前
TCP面试题之滑动窗口原理
TCP滑动窗口作用:1.提供TCP可靠性:对发送的数据进行确认2.流量控制:窗口大小随链路变化一、TCP窗口机制TCP中窗口大小是指tcp协议一次传输多少个数据。因为TCP是一个面向连接的可靠的传输协议,既然是可靠的就需要传输的数据进行确认。TCP窗口机制有两种,一种是
Wesley13 Wesley13
3年前
C++中各种获取窗口句柄的方法
AfxGetMainWndAfxGetMainWnd获取自身窗口句柄HWNDhWndAfxGetMainWnd()m\_hWnd;GetTopWindow函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的句柄。函数原型:HWNDGetTopWind
公孙晃 公孙晃
2年前
Mac窗口布局增强工具:Rectangle Pro for Mac
RectanglePro是一款Mac上的窗口管理工具,它可以帮助用户更加高效地管理和布局窗口。用户可以通过快捷键或者鼠标手势来实现窗口的调整和布局,包括窗口的移动、调整大小、屏幕分割等操作...
常用限流算法详解
一、有哪些常用的限流算法1.固定窗口限流;2.滑动窗口限流;3.漏桶算法限流;4.令牌桶算法限流。二、4种限流算法介绍1.固定窗口限流举例说明:假设时间窗口大小为5s,则0到5s为第一个窗口,5到10s为第二个窗
贾蔷 贾蔷
1星期前
牛客3750题滑动窗口最大值解析:双端队列优化解法与代码详解
一、题目解读要求在一个给定的整数中,计算固定大小为k的内元素的最大值。例如,当窗口滑动时,需要实时输出每个窗口中的最大值序列。该问题考察对的理解,以及如何高效维护窗口内的元素关系。二、解题思路采用(deque)维护的巧妙解法。核心思想是:中仅存储数组下标,