LeetCode 热题 100 | 滑动窗口

目录

[1 3. 无重复字符的最长子串](#1 3. 无重复字符的最长子串)

[2 438. 找到字符串中所有字母异位词](#2 438. 找到字符串中所有字母异位词)


菜鸟做题第二周,语言是 C++

1 3. 无重复字符的最长子串

解题思路:

  1. 设置两个指针,左指针和右指针,二者之间形成窗口
  2. 右指针不断右移,新字母被纳入其中,窗口也变得越来越长
  3. 只有当窗口外的新字母与窗口内的字母重复时,左指针才右移
  4. 注意:在左指针右移前,还要利用它把重复的老字母去掉

用什么数据结构表示窗口?哈希表 unordered_set,帮助快速查重。

思路说明图:

假设在开始时 set/window 中只有一个字母 a 。第 1 时刻,right 指向的新字母 b 与窗口内的字母没有重复,因此将 b 纳入窗口中,right 右移一格。第 2 时刻,right 指向的新字母 c 与窗口内的字母没有重复,因此将 c 纳入窗口中,right 右移一格。第 3 时刻,right 指向的新字母 a 与窗口内的字母重复,这时 left 右移一格,起到去重的作用。以此类推。

那如何快速检验是否重复呢?借助哈希表的 find 或者 count 函数。

cpp 复制代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size();
        if (n == 0) return 0;

        unordered_set<char> set;
        set.insert(s[0]);

        int right = 1, len = 0;
        for(int left = 0; left < n; ++left) {
            while (right < n && set.find(s[right]) == set.end()) {
                set.insert(s[right]);
                ++right;
            }
            len = max(len, right - left);
            set.erase(s[left]);
        }
        return len;
    }
};

2 438. 找到字符串中所有字母异位词

我鼠啦,一直想着用哈希表减少时间,结果答案根本没用哈希表。。。因为该题中的字母是允许重复的,所以哈希表的查重功能貌似派不上用场。

解题思路:

  1. 窗口长度是固定的,且为 p 字符串的长度
  2. 让窗口在 s 字符串上不断右移
  3. 通过窗口内各字母的个数来判断是不是异位词

本题和上一题的窗口有两个不同点。一是,本题的窗口长度是固定的,而上一题的窗口是逐渐变长的;二是,本题的窗口被实例为 vector<int> 用于装 26 个字母的个数,而上一题的窗口直接用于装字母。

cpp 复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int sLen = s.size(), pLen = p.size();
        vector<int> sCount(26), pCount(26);
        vector<int> ans;

        if (sLen < pLen) return {};
        
        // 初始化窗口
        for (int i = 0; i < pLen; ++i) {
            ++sCount[s[i] - 'a'];
            ++pCount[p[i] - 'a'];
        }

        if (sCount == pCount) ans.push_back(0);
        
        // 不断右移窗口
        for (int i = 0; i < sLen - pLen; ++i) {
            --sCount[s[i] - 'a'];
            ++sCount[s[i + pLen] - 'a'];
            if (sCount == pCount) ans.push_back(i + 1);
        }

        return ans;
    }
};
相关推荐
全糖可乐气泡水41 分钟前
Codex适配国产信创环境安装部署与技术适配全解析
开发语言·git·python·算法·百度
h_a_o777oah1 小时前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
05候补工程师1 小时前
从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南
人工智能·算法·安全·架构·机器人
手写码匠2 小时前
Android 17 适配实战指南:新特性解读、隐私变更与迁移全攻略
人工智能·深度学习·算法·aigc
珊瑚里的鱼2 小时前
leetcode42雨水
算法·leetcode
水木流年追梦3 小时前
大模型入门-大模型的推理策略
开发语言·python·算法·正则表达式·prompt
生成论实验室3 小时前
用事件关系网络重新理解AI(三):激活函数、微调与元学习
人工智能·学习·算法·语言模型·可信计算技术
Narv工程师3 小时前
嵌入式机器人控制器算力评估:从DMIPS到WCET的完整指南
人工智能·算法·机器学习
蒟蒻的贤3 小时前
实训1227
算法
liulilittle3 小时前
TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法
linux·网络·c++·tcp/ip·算法·c·通讯