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

文章描述了一种使用滑动窗口和两个哈希表的方法,解决给定字符串s中找到与目标字符串p具有相同字符分布的子串的问题。通过统计p中字符的出现次数并动态维护窗口内的字符计数,找出所有有效子串的起始位置。
摘要由CSDN通过智能技术生成

解题思路:滑动窗口

三步走  进窗口  判断   出窗口   然后更新结果 

 定义两个hash表在第一个表中存 p的有效字符  比如 abc   a一个 b一个 c一个 这样就存在三个有效字符  在第二个hash表中进行滑动窗口的运行  定义一个常量count 如果滑动窗口中有效字符存在一个就 +1 

 第二个hash表中 进窗口时候怎么才能算有效字符呢? 

hash2[s[right] -'a'] <=hash1[s[right] -'a']   这个时候 count++

这个条件就是滑动窗口中比如a 有 1个 或者2个 3个等等 但是它不能大于p中a的个数 一旦大于就非有效 

之后判断我们滑动窗口大于p的数组长度时候就需要删减

            char out=s[left++];

            if(hash2[out-'a']<=hash1[out-'a']) count--;   判断出去的是否为有效字符

            hash2[out-'a']--; 删减

然后最后一步更新结果 将 count==p.size() 的结果拼接到顺序表之中

代码如下

class Solution {
public:
    vector<int> findAnagrams(string s, string p) 
    {
        vector<int> ret;
       int hash1[26]={0};//统计p中每个字符出现的个数
       for(auto ch:p)
       {
          hash1[ch-'a']++;
       }
       int m=p.size();

       int hash2[26]={0};//统计窗口里面每一个字符出现的个数
       for(int left=0, right=0,count=0 ;right<s.size();right++)
       {
          char in=s[right];
          hash2[in-'a']++;
          if(hash2[in-'a']<=hash1[in-'a'])  count++;//有效字符就 ++
          if(right-left+1>m)
          {
            char out=s[left++];
            if(hash2[out-'a']<=hash1[out-'a']) count--;//判断出去的是否为有效字符
            hash2[out-'a']--;
          }
          if(count==m)
          {
            ret.push_back(left);
          }
       }
       return ret;
    }
};

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值