• Leetcode刷题详解——找到字符串中所有字母异位词


    1. 题目链接:438. 找到字符串中所有字母异位词

    2. 题目描述:

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

    异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

    示例 1:

    输入: s = "cbaebabacd", p = "abc"
    输出: [0,6]
    解释:
    起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
    起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    示例 2:

    输入: s = "abab", p = "ab"
    输出: [0,1,2]
    解释:
    起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
    起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
    起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    提示:

    • 1 <= s.length, p.length <= 3 * 104
    • sp 仅包含小写字母

    3. 解法(滑动窗口+哈希表)

    3.1 算法思路:

    • 因为字符串p的异位词的长度一定与字符串p的长度相同,所以我们可以在字符串s中构造一个长度为与字符串p的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量
    • 当窗口中每种字母的数量与字符串p中每种字母的数量相同时,则说明当前窗口为字符串p的异位词
    • 因此可以用两个大小为26的数组来模拟哈希表,一个来保存s中的子串每个字符出现的个数,
    • 另一个来保存p每一个字符出现的个数。这样就能判断两个串是否是异位词

    3.2 算法流程:

    1. 初始化hash1数组,用来统计字符串p中每个字符出现的次数。
    2. 初始化hash2数组,用来统计滑动窗口内每个字符出现的次数。
    3. 将滑动窗口的左边界left和右边界right都初始化为0
    4. 遍历字符串s,从左到右依次将字符加入窗口。
    5. 判断是否需要移动窗口。如果窗口长度超过了p的长度,就需要移动窗口,判断是否需要从窗口中移出最左边的字符。
    6. 如果需要移出字符,就从窗口中移出最左边的字符,并更新hash2数组和count变量。
    7. 判断窗口内的字符是否是p的异位词。如果是,将左边界的索引加入结果数组ret
    8. 返回结果数组ret

    请添加图片描述

    3.3 C++算法代码:

    class Solution {
    public:
        vector findAnagrams(string s, string p) {
            vector ret;
            int hash1[26]={0};//统计字符串p中每个字符出现的次数
            for(auto ch:p)
            hash1[ch-'a']++;
            int hash2[26]={0};//统计窗口里面的每个字符出现的个数
            int m=p.size();
            for(int left=0,right=0,count=0;rightm)//判断
                {
                    char out=s[left++];
                    if(hash2[out-'a']--<=hash1[out-'a'])count--;//出窗口+维护 count
                }
                //更新结果
                if(count==m)
                ret.push_back(left); 
            }
            return ret;
     
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    人工智能知识全面讲解:简要解析循环神经网络
    【力扣】83. 删除排序链表中的重复元素
    汽车SOA-AUTOSAR-IOS架构分析
    MySQL完全备份与恢复
    ubuntu 安装 jenkins
    virtualbox安装openEuler-方案二
    Linux环境下C++使用CMakeLists编译运行gRPC最小化独立入门项目
    告警平台设计方案
    Helm 基础入门 Helm介绍与安装
    信息化发展77
  • 原文地址:https://blog.csdn.net/weixin_51799303/article/details/133895965