HOT100 (滑动窗口&子串&普通数组&矩阵)

先填坑

滑动窗口

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

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

思路:用一个uset容器存放当前滑动窗口中的元素

#include <bits/stdc++.h>
using namespace std;
class Solution {
   
public:
    int lengthOfLongestSubstring(string s) {
   
       unordered_set<char> str;
       int left = 0,right = 0;
       
       int maxLen = 0;
       for(;right < s.size(); right++) {
   
            while(left < right && str.count(s[right])) {
   
                str.erase(s[left++]);
            }
            maxLen = max(right - left + 1, maxLen);
            str.insert(s[right]);
        }
        return maxLen;
    }
};

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

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

思路:先用vector数组把p存起来,然后遍历s,记滑动窗口右边界为r,则cnt[s[r] - a] < 0,滑动窗口左边界l右移cnt[s[l] - a] ++;

class Solution {
   
public:
    vector<int> findAnagrams(string s, string p) {
   
        vector<int> cnt(26, 0);
        vector<int> res;
        for(char c : p) {
   
            cnt[c - 'a']++;
        }
        int l = 0, r = 0;
        while(r < s.size()) {
   
            cnt[s[r] - 'a']--;
            r++;
            while(cnt[s[r - 1] - 'a'] < 0){
   
                cnt[s[l] - 'a']++;
                l++;
            }
            if(r - l  == p.size()) {
   
                res.push_back(l);
            }
        }
        return res;
    }
};

子串

560. 和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。

前缀和+哈希,用unordered_map<前缀和, 出现次数> umap来存储前缀和,则符合条件的[i, j] 满足pre[j]-pre[i-1] == k;遍历nums[i] ,求和umap[pre - k]

class Solution {
   
public:
    int subarraySum(vector<int>& nums, int k) {
   
        unordered_map<int, int> umap;
        umap[0] = 1;
        int pre = 0, count = 0;
        for(int i = 0; i < nums.size();
滑动窗口算法(Sliding Window Algorithm)是一种常用的字符串处理技术,用于在一个较大的文本串中查找满足特定条件的子串。这种方法通常用于遍历一段数据并只保留部分数据进行操作,就像一个&ldquo;窗口&rdquo;在数据流上滑动一样。 要使用滑动窗口算法寻找子串,你需要完成以下步骤: 1. **定义窗口**:选择一个固定大小的窗口,例如,假设你想找到长度为K的子串。 2. **初始化**:设置两个指针,左指针`left`和右指针`right`,分别指向子串的起始位置和结束位置。初始时,`left = right = 0`。 3. **移动窗口**:每次循环,执行以下操作: a. 检查当前子串是否符合条件(例如,是否等于给定的目标字符串、是否包含特定字符序列等)。如果符合,记录下该子串的位置或结果。 b. 将右指针向后移动一位,直到`right + 1 == K`,表示窗口已扩展到下一个字符。 c. 如果不符合条件,可能有两种情况: - 如果当前子串不满足条件,但右指针可以向左移动一位而不改变子串的性质,则尝试缩小窗口 (`right--`)。 - 否则,保持窗口不变,从头开始再次检查。 4. **重复**:继续移动窗口,直到右指针超过原始字符串的末尾。 5. **优化**:为了避免重复计算,对于每个右指针的位置,只需检查从`left`到`right`的子串,因为之前的子串已经在搜索过程中被考虑过。 下面是简单的滑动窗口算法伪代码示例,用于查找一个整数数组中的连续子数组,其和等于给定的目标值`target`: ```c int* slidingWindowSum(int* nums, int numsSize, int target) { if (numsSize == 0 || target == 0) return NULL; int left = 0, sum = 0, right = 0; while (right &lt; numsSize) { // 更新当前子串的和 sum += nums[right]; // 当前子串和等于目标值时,返回结果 if (sum == target) { // 返回子串范围 [left, right] return &amp;nums[left]; } // 不满足条件,调整窗口 if (sum &gt; target) { sum -= nums[left]; left++; } right++; } return NULL; // 没有找到符合条件的子串 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值