Leetcode每日刷题之438.找到字符串中所有字符异位词

1.题目解析

本题的题目要求是给定一个长字符串s与一个较短字符串p,判断s中是否有一段与p长度相同的字符串是由p打乱而得来,即为异位词,然后返回其开始位置下标,遍历s字符串中所有满足条件字符串的起始位置下标

2.算法原理

我们将p中的字符串个数统计在一个哈希表里,然后使用"滑动窗口"的思想来遍历p字符串中的异位词,此时设置一个变量count来统计窗口内有效字符的个数,如果窗口内有效字符的个数满足p字符串长度则为异位词,返回其下标即可,然后向后遍历直到结束

3.代码展示

cpp 复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) 
    {
        vector<int> v;
        int hash1[26] = { 0 };
        int hash2[26] = { 0 };//统计窗口中出现字符的个数
        for(auto ch : p)
        {
            hash1[ch - 'a']++;//统计p中字符串长度
        }
        int m = p.size();
        int n = s.size();
        for(int left = 0,right = 0,count = 0;right < n;right++)
        {
            char in = s[right];
            if(++hash2[in - 'a'] <= hash1[in - 'a'])
            {
                count++;//进窗口 + 维护 count 
            }
            if(right - left + 1 > m)
            {
                char out = s[left++];
                if(hash2[out - 'a']-- <= hash1[out - 'a'])
                {
                    count--;//出窗口 + 维护 count 
                }
            }
            if(count == m)
            {
                v.push_back(left);
            }
        }
        return v;
    }
};
相关推荐
汀、人工智能18 分钟前
[特殊字符] 第2课:字母异位词分组
数据结构·算法·链表·数据库架构··字母异位词分组
Tanecious.23 分钟前
蓝桥杯备赛:Day3-P1918 保龄球
c++·蓝桥杯
良木生香30 分钟前
【C++初阶】:C++类和对象(下):构造函数promax & 类型转换 & static & 友元 & 内部类 & 匿名对象 & 超级优化
c语言·开发语言·c++
小O的算法实验室1 小时前
2026年SEVC,面向主动成像卫星任务规划问题的群体智能与动态规划混合框架,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
网安INF1 小时前
数据结构第一章复习:基本概念与算法复杂度分析
数据结构·算法
幻风_huanfeng1 小时前
人工智能之数学基础:什么是凸优化问题?
人工智能·算法·机器学习·凸优化
三雷科技1 小时前
使用 `dlopen` 动态加载 `.so` 文件
开发语言·c++·算法
Yzzz-F2 小时前
Problem - 2146D1 - Codeforces &&Problem - D2 - Codeforces
算法
Kk.08022 小时前
力扣 LCR 084.全排列||
算法·leetcode·职场和发展
环黄金线HHJX.2 小时前
龙虾钳足启发的AI集群语言交互新范式
开发语言·人工智能·算法·编辑器·交互