Leetcode热题100-438 找出字符串中所有字母异位数

Leetcode热题100-438 找出字符串中所有字母异位数

1. 题目描述

438 找出字符串中所有字母异位数

2. 解题思路

该题所用到的算法为定长字符串滑动窗口, 其中窗口的大小为字符串p的长度:

  1. 定义两个无序哈希表window、need,其中window表示当前窗口内的元素,need表示需要匹配的字符串;
  2. 从左到右依次遍历字符串s,依次将当前字符加入window中,当当前窗口大小恰好等于字符串p的长度时,判断window与need是否一致,若一致则left放入结果res中;
  3. 当前窗口左边界右移,并将s[left]移出当前窗口;
  4. 按照2、3步骤依次遍历字符串s。

3. 代码实现

class Solution {
public:
    // 定长滑动窗口,窗口的大小为字符串p的长度
    vector<int> findAnagrams(string s, string p) {
        // 用以保存最终结果
        vector<int> res;
        unordered_map<char, int> need, window;
        for (auto ch : p) {
            need[ch]++;
        }
        int left = 0, right = 0;

        while (right < s.size()) {
            char c = s[right++];
            if (need.count(c)) {
                window[c]++;
            }
            // 恰好等于窗口的大小时,判断该窗口是否合理
            if (right - left == p.size()) {
                if (window == need) {
                    res.push_back(left);
                }
                char d = s[left++];
                if (need.count(d)) {
                    window[d]--;
                }
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值