算法---滑动窗口练习-6(找到字符串中所有字母异位词)

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

1. 题目解析

题目地址找到字符串中所有字母异位词

在这里插入图片描述

2. 讲解算法原理

在这里插入图片描述
在这里插入图片描述

有效字符个数count更新条件:满足【hash1表(遍历s的表)中对应元素出现次数<=hash2表(存p的表)中对应元素出现次数】
在这里插入图片描述
在这里插入图片描述


算法的基本思想是使用滑动窗口来遍历字符串s,并利用两个哈希表(hash1和hash2)来统计窗口中字符的频次。

具体的算法步骤如下:

  1. 初始化两个长度为26的数组hash1和hash2,用于记录字符串的字符频次。初始时,数组中所有元素都为0。

  2. 遍历字符串p,将其中的字符映射到hash2数组中,并增加相应字符的频次。

  3. 定义两个指针left和right,初始时都指向字符串s的第一个字符。

  4. 进入循环,循环条件为right指针小于字符串s的长度。

    • 在循环中,首先将当前right指针指向的字符加入窗口,即将hash1数组中对应字符的频次加1。

    • 检查加入窗口的字符是否是有效字符,即其频次小于等于hash2数组中对应字符的频次。如果是有效字符,则将计数器count加1。

    • 检查窗口大小是否超过了字符串p的长度,即right-left+1是否大于len2。如果超过了窗口大小,则需要移动窗口。

    • 移动窗口的过程包括以下几个步骤:

      • 检查窗口左侧字符是否是有效字符,即其频次小于等于hash2数组中对应字符的频次。如果是有效字符,则将计数器count减1。
      • 将窗口左侧字符从窗口中移除,即将hash1数组中对应字符的频次减1。
      • 将左指针left向右移动一位。
    • 检查计数器count是否等于字符串p的长度len2。如果相等,则表示当前窗口是一个字母异位词,将左指针left的位置加入结果集ret。

    • 将右指针right向右移动一位,继续循环。

  5. 循环结束后,返回结果集ret,其中包含了所有字母异位词的起始位置。


3. 编写代码


class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int hash1[26]={0},hash2[26]={0};
        int left=0,right=0,len2=p.size(),len1=s.size();
        vector<int> ret; 
        for(auto ch:p)hash2[ch-'a']++;
        int count=0;
        //利用变量count来统计窗口中“有效字符”的个数
        while(right<len1)
        {    
            hash1[s[right]-'a']++;//进窗口
            if(hash1[s[right]-'a']<=hash2[s[right]-'a'])
            {
                count++;
            }
            if(right-left+1>len2)
            {
                if(hash1[s[left]-'a']<=hash2[s[left]-'a'])
                {
                    count--;
                }
                hash1[s[left]-'a']--;
                left++;
            }
            if(count==len2)
            ret.push_back(left);
            
            right++;
        }
        return ret;
    }
};

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 00:20:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 00:20:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 00:20:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 00:20:03       18 阅读

热门阅读

  1. MyBatis:枚举类型与字符串比较

    2024-03-20 00:20:03       21 阅读
  2. opencv4 如何截取子图象

    2024-03-20 00:20:03       22 阅读
  3. 思科防火墙如何配置静态NAT

    2024-03-20 00:20:03       19 阅读
  4. 作用域(词法作用域)

    2024-03-20 00:20:03       22 阅读
  5. 聚合函数和GROUP BY

    2024-03-20 00:20:03       19 阅读
  6. LeetCode第389场周赛个人题解

    2024-03-20 00:20:03       20 阅读
  7. ocp考试通过率如何?ocp考试内容有哪些?

    2024-03-20 00:20:03       32 阅读
  8. ocp考试是中文还是英文?ocp认证好考吗

    2024-03-20 00:20:03       26 阅读
  9. 【LeetCode周赛】第 389 场周赛

    2024-03-20 00:20:03       21 阅读
  10. LeetCode 76 最小覆盖子串

    2024-03-20 00:20:03       18 阅读
  11. Git 的基本概念和使用方式。

    2024-03-20 00:20:03       16 阅读