滑动窗口7:30. 串联所有单词的子串

链接: 30. 串联所有单词的子串 - 力扣(LeetCode)

滑动窗口基本解题思路:

  • 进窗口
  • 判断
  • 出窗口
  • 更新结果(该步骤顺序不固定,可能在进窗口时更新结果,也可能在判断成立时更新结果,也有可能在判断条件结束之后更新结果)
cpp 复制代码
class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> ans;
        // 记录words中的单词
        unordered_map<string, int> wCount;
        for (auto& e : words) wCount[e] += 1;

        int len = words[0].size();
        int num = words.size();
        //判断
        if (len * num > s.size()) return ans;

        // 记录滑动窗口中的单词
        int n = s.size();
        
        for (int i = 0; i < len; i++)
        {
            unordered_map<string, int> sCount;
            for (int left = i, right = i, count = 0; right < n; right+=len)
            {
                //进窗口
                string word1 = s.substr(right, len);
                sCount[word1] += 1;
                count++;
                //判断
                if (count > num)
                {
                    //出窗口
                    string word2 = s.substr(left, len);
                    sCount[word2] -= 1;
                    if (sCount[word2] == 0) sCount.erase(word2);
                    left += len;
                    count--;
                }
                //更新结果
                if (sCount == wCount) ans.emplace_back(left);
            }
        }
        return ans;
    }
};
相关推荐
zxctsclrjjjcph4 分钟前
【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题
开发语言·c++·算法·力扣
朱剑君8 分钟前
排序算法——堆排序
算法·排序算法
某不知名網友33 分钟前
linux_进程地址空间(虚拟地址空间)
java·linux·算法
bryant_meng1 小时前
【python】Calculate the Angle of a Triangle
开发语言·python·算法
纪元A梦1 小时前
贪心算法应用:最小反馈顶点集问题详解
java·算法·贪心算法
1白天的黑夜11 小时前
动态规划-62.不同路径-力扣(LeetCode)
c++·算法·leetcode·动态规划
少了一只鹅2 小时前
深入理解指针(3)
c语言·数据结构·算法
仙人掌_lz2 小时前
从零开始理解FlashAttention:算法细节图解
人工智能·python·深度学习·算法·ai·flashattention
有一个好名字2 小时前
力扣:轮转数组
数据结构·算法·leetcode
北海有初拥2 小时前
【day04】Fibonacci数列 | 单词搜索 | 杨辉三角
算法