[哈希/滑动窗口] leetcode 438 Find All Anagrams in a String

problem:https://leetcode.com/problems/find-all-anagrams-in-a-string

        主要思路是维护两个hashmap,一个记录期望出现的字符,一个记录当前出现的字符。

        当前出现的字符随着窗口滚动不停更新,每次移动窗口后,都判断当前窗口是否满足条件。同时维护一个满足条件的count变量,通过比较当前出现字符和期望出现字符的个数来更新,当count等于期望字符串的长度时,意味着当前窗口满足条件。

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        unordered_map<int, int> expect;
        unordered_map<int, int> cur;

        int n = s.size();
        int k = p.size();

        for (int i = 0; i < k; i++)
        {
            expect[p[i]]++;
        }
        int count = 0;

        vector<int> res;
        for (int i = 0; i < n; i++)
        {
            // insert
            cur[s[i]]++;
            if (expect.find(s[i]) != expect.end() && cur[s[i]] <= expect[s[i]])
            {
                count++;
            }

            // erase
            if (i >= k)
            {
                if (expect.find(s[i - k]) != expect.end() && cur[s[i - k]] <= expect[s[i - k]])
                {
                    count--;
                }
                cur[s[i - k]]--;
                if (cur[s[i - k]] == 0)
                {
                    cur.erase(s[i - k]);
                }
            }
       // check valid
            if (k == count)
            {
                res.push_back(i - k + 1);
            }
        }

        return res;
    }
};

 

posted @ 2019-07-30 13:37  fish1996  阅读(265)  评论(0编辑  收藏  举报