跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

滑动窗口算法实战:水果成篮与异位词

通过两道力扣题目讲解滑动窗口算法。第一题水果成篮要求选取包含最多两种水果的最长子数组,使用哈希表统计种类数,当种类超过 2 时收缩左边界。第二题找到字符串中所有字母异位词要求找出 s 中 p 的异位词起始索引,通过比较字符频次判断。文章提供了基于 unordered_map 和数组优化的两种解法,分析了时间复杂度并给出了 C++ 代码实现。

鲜活发布于 2026/3/30更新于 2026/10/25104 浏览
滑动窗口算法实战:水果成篮与异位词

水果成篮

题目解析

图片

图片

图片

本题要求从一个数组里面选取两个数组成的最长子数组。暴力解法时间复杂度为 O(N^2),滑动窗口可优化至 O(N)。

算法原理

引入变量判断种类,数的范围是 10 的五次方,所以引入的 hash 表为 100001。固定三部曲:进窗口的时候维护 kinds,如果最开始为 0,那么没有该水果种类,就可以直接 kinds++。判断条件如果 kinds 大于水果种类的话,就出窗口,即 left++。同时要维护 kinds,如果哈希表的映射变为 0 了,那么 kinds 就--。

算法编写

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int hash[100001] = { 0 };
        int ans = 0, kinds = 0;
        for(int left = 0, right = 0; right < fruits.size(); right++) {
            // 进窗口
            if(hash[fruits[right]]++ == 0) kinds++;
            // 判断
            while(kinds > 2) {
                if(--hash[fruits[left++]] == 0) kinds--;
            }
            // 更新结果
            ans = max(ans, right - left + 1);
        }
        return ans;
    }
};

此时的时间复杂度是 O(N)。


找到字符串中所有字符异位词

题目解析

图片

图片

题目要求返回所有异位词的起始索引。异位词指将原字符串进行排列组合之后组成的字符串。判断某个子串是不是异位词,可以使用哈希表映射统计字符频次。

算法原理

判定为滑动窗口,使用一个连续的区间和另一个连续的区间进行比较。进窗口使用 right 指针,当 right 和 left 的区间长度大于了目标字符串的长度时,需要出窗口,左边出窗口即可。

使用哈希映射,统计目标字符串中字符出现的频次。第一个哈希表用来计算目标字符串出现的字母频次,第二个哈希表用来计算左右区间出现的字符频次,最后比较两个哈希表是否相等。

出窗口的时候,如果目标字符的频次变成了 0,就删除该元素。此时两个哈希表判断是否相等,相等更新结果。

算法编写

基于 unordered_map 的实现:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ans;
        unordered_map<char,int> hash1;
        unordered_map<char,int> hash2;
        for(auto e : p) hash1[e]++;
        for(int left = 0, right = 0; right < s.size(); right++) {
            hash2[s[right]]++;
            if((right - left + 1) > p.size()) {
                char out = s[left];
                if(--hash2[out] == 0) hash2.erase(out);
                left++;
            }
            if(hash1 == hash2) ans.push_back(left);
        }
        return ans;
    }
};

基于数组优化的实现:

由于字母只有 26 个且都是小写,可以使用数组模拟哈希表。引入变量 kinds 统计有效字符的个数。对于异位词来说,有效字符的个数就是相当于排序之后的任意字符串的一个一致结果。

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ans;
        int hash1[26];
        int hash2[26];
        int kinds = 0;
        memset(hash1, 0, sizeof(hash1));
        memset(hash2, 0, sizeof(hash2));
        for(auto e : p) hash1[e - 'a']++;
        for(int left = 0, right = 0; right < s.size(); right++) {
            if(++hash2[s[right] - 'a'] <= hash1[s[right] - 'a']) kinds++;
            if(right - left + 1 > p.size()) {
                char out = s[left++];
                if(hash2[out - 'a']-- <= hash1[out - 'a']) kinds--;
            }
            if(kinds == p.size()) ans.push_back(left);
        }
        return ans;
    }
};

运行时间显著提升。

目录

  1. 水果成篮
  2. 题目解析
  3. 算法原理
  4. 算法编写
  5. 找到字符串中所有字符异位词
  6. 题目解析
  7. 算法原理
  8. 算法编写

更多推荐文章

查看全部
  • C++ 类与对象全面剖析:构造函数深化与静态成员特性
  • Web 应用架构与常见安全漏洞解析
  • 基于 LLaMA-Factory 的 LLM DPO 训练实战
  • F5 刷新时,浏览器前端究竟发生了什么?
  • Redis Hash 类型详解
  • Linux 进程通信核心原理与实战:匿名管道、命名管道、进程池
  • Cursor 中配置与使用 MCP 服务的实战指南
  • Milvus 实战:Attu 可视化安装与 Python 整合指南
  • 命令行大模型上下文协议(MCP)交互工具 MCPHost 实践
  • 利用 AI 快速构建 Windows 18-HD19 风格 CSS 组件库
  • RabbitMQ 事务机制详解与 Spring 配置实践
  • HTTP 代理 IP 地址列表
  • 飞书 OpenClaw 机器人 HTTP 401 Invalid Authentication 报错排查
  • VsCode 远程 Copilot 调用 Claude Agent 报“无效请求”:参数配置排查与修复
  • 前缀和算法实战:和为 K 的子数组与和可被 K 整除的子数组
  • Spring AI Alibaba 快速入门指南
  • FLAC3D 边坡地震稳定性动力分析:基线校正与模拟实现
  • C++ 红黑树:原理、旋转与完整实现
  • C++ STL 容器:基于红黑树模拟实现 map 和 set
  • Ubuntu 24.04 使用 Docker Compose 本地部署 Whisper 语音识别服务

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online