首页 > 其他分享 >「LeetCode Top100」之滑动窗口

「LeetCode Top100」之滑动窗口

时间:2024-08-11 17:39:04浏览次数:13  
标签:窗口 ++ int pCount sCount 滑动 Top100 LeetCode

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

题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-100-liked
题目难度:中等
标签:哈希表字符串滑动窗口
题目状态:学习题解

思路:

滑动窗口的思路,也就是维持一个无序队列unordered_set<char>用来当作这个窗口。

  • 遍历字符串,若当前字符不在窗口中,就将该字符insert进窗口中,然后将长度加1。
  • 若当前字符在窗口中,就将窗口的左侧元素移除,这样就实现了移动这个窗口。然后判断当前的子串长度是否大于之前的长度。

当遍历结束,就获得了子串的最大长度。

代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() == 0) return 0;
        unordered_set<char> window;
        int maxStr = 0;
        int left = 0;
        for(int i = 0; i < s.size(); ++i) {
            while(window.find(s[i]) != window.end()) {
                window.erase(s[left]);
                left++;
            }
            maxStr = max(maxStr, i - left + 1);
            window.insert(s[i]);
        }
        return maxStr;
    }
};

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

题目链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=study-plan-v2&envId=top-100-liked
题目难度:中等
标签:哈希表字符串滑动窗口
题目状态:学习题解

思路:

这题使用滑动窗口解决,滑动窗口的大小是p的大小。然后创建两个26位的数组,pCount和sCount,其中pCount保存p的字母状态,这个是固定的,用来与sCount进行比较的。sCount中保存的是当前滑动窗口里面的s的字母状态。若pCount和sCount相等,则压入结果数组中。

代码:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int sLen = s.size(), pLen = p.size();
        if(sLen < pLen) return vector<int>();
        
        vector<int> ans;
        vector<int> sCount(26);
        vector<int> pCount(26);
        for(int i = 0; i < pLen; ++i) {
            ++sCount[s[i] - 'a'];
            ++pCount[p[i] - 'a'];
        }

        if(sCount == pCount) ans.emplace_back(0);

        for(int i = 0; i < sLen - pLen; ++i) {
            --sCount[s[i] - 'a'];
            ++sCount[s[i + pLen] - 'a'];

            if(sCount == pCount) ans.emplace_back(i + 1);
        }
        return ans;
    }
};

标签:窗口,++,int,pCount,sCount,滑动,Top100,LeetCode
From: https://www.cnblogs.com/frontpen/p/18353563

相关文章

  • LeetCode 算法:最小栈 c++
    原题链接......
  • 「LeetCode Top100」之双指针
    283.移动零题目链接:https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked题目难度:简单标签:数组、双指针题目状态:AC思路:两个指针,i用来找0,j用来找非0。当nums[i]==0&&nums[j]!=0时,将两者交换。代码:classSolutio......
  • flutter滑动分析
    ListView.builder优点:内存管理: ListView.builder 使用了懒加载机制,只渲染当前视口内的列表项,这样可以有效节省内存和性能。适用于长列表。简单易用:作为Flutter内置的组件,易于使用和配置,不需要额外依赖。性能优化:内置的高效滚动性能,不需要手动管理滚动或视图更新。......
  • Leetcode 206. 反转链表
    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[]提示: 链表中节点的数目范围是 [0,5000]-5000<=Node.val<=5000方法一: //双指......
  • LeetCode | 20 ValidParentheses
    分析括号成对出现,键值对类型括号字符序列嵌套出现,不能错位,顺序具有对称性为什么不用数组这种数据结构来记录数量?因为这种方法不能保证括号的正确顺序。例如,字符串'({[)}]'会被认为是有效的。栈解决有效括号问题当遇到一个左括号时,我们需要记住它,以便在后续遇到相应的右括......
  • LeetCode | 225 Implement Stack Using Queues
    分析阻塞(Blocking)阻塞操作指的是在调用一个函数或方法时,如果该操作不能立即完成(例如,因为需要等待某个事件的发生,如数据达到或资源可用),那么当前线程或进程会被挂起(暂停执行),直到操作完成为止。在这个等待期间,线程或进程无法执行其他任务。等待:调用方必须等待操作完成独......
  • leetcode-12 字符串
    12.2字符串比较242有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。//解法1:排序后逐个比较字符boolisAnagram(strings,stringt){if(s.length()......
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
    刷题记录*并查集理论基础107.寻找存在的路径*并查集理论基础讲解107.寻找存在的路径题目地址直接套模板。结点编号从1开始,因此定义father数组时需要n+1个空间,否则会越界。时间复杂度:O(......
  • LeetCode | 541 Reverse String II
    分析以2k作为游标步长,反转游标前半部分的字符串,后半部分保留;尾部部分余留长度,如果在[k,2k)直接处理情况跟前述一样,如果不是则直接返回。在这道题里面,还是回到数组部分提到的循环不变量法则,在2k长度这个游标移动过程中,处理完全一致:2k步长移动,只处理[2i,2i+k]部分,即便是尾部也是如......
  • 151. 反转字符串中的单词【 力扣(LeetCode) 】
    一、题目描述  给你一个字符串s,请你反转字符串中单词的顺序。  单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。  返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾......