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

发布时间 2023-07-21 14:31:03作者: xiazichengxi

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

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


示例 1:

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

> 思路

***采用滑动窗口的做法

> 代码


class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int len1 = s.size();
        int len2 = p.size();
        if(len1 < len2) return {};
        unordered_map<char,int> mp_s;
        unordered_map<char,int> mp_p;
        for(const auto &c:p){
            mp_p[c]++;
        }
        int l = 0;int r = 0;int valid = 0;
        vector<int> res;
        sort(p.begin(),p.end());
        while(r < len1){
            //扩大窗口
            if(mp_p.count(s[r])){
                mp_s[s[r]]++;
                if(mp_p[s[r]] == mp_s[s[r]]){
                    valid++;
                }
            }
            //满足条件 缩小窗口
            while(r - l + 1 >= len2){
                if(valid == mp_p.size()){
                    res.push_back(l);
                }
                if(mp_p.count(s[l])){
                    if(mp_p[s[l]] == mp_s[s[l]]){
                        valid--;
                    }
                    mp_s[s[l]]--;
                }
                l++;
            }
            r++;
        }
        return res;
    }
};