自学内容网 自学内容网

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;
    }
};

原文地址:https://blog.csdn.net/qewa132/article/details/142638155

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!