Cover image for LeetCode Hot 100 P438 Find All Anagrams in a String

LeetCode Hot 100 P438 Find All Anagrams in a String

Words 306
Views
Visitors

Timeline

Timeline

2026-03-11

init

Sliding window

Problem:

Classic sliding window problem

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
// 2026.3.11 10:58#include <vector>#include <string>using std::string;using std::vector;class Solution {    public:        vector<int> findAnagrams(string s, string p)        {                int i, index, valid = 0, need_valid = 0;                int left = 0, right;                int slen = s.size(), plen = p.size();                vector<int> need(26, 0);                vector<int> curr(26, 0);                vector<int> ret;                for (i = 0; i < plen; i++)                        need[p[i] - 'a']++;                                for (i = 0; i < 26; i++)                        if (need[i] > 0)                                need_valid++;                for (right = 0; right < slen; right++) {                        if (right - left + 1 > plen) {                                index = s[left] - 'a';                                if (curr[index] == need[index])                                        valid--;                                curr[index]--;                                left++;                        }                        index = s[right] - 'a';                        curr[index]++;                        if (curr[index] == need[index])                                valid++;                        if (valid == need_valid)                                ret.push_back(left);                }                return ret;        }};// 2026.3.11 11:19

acm mode rewrite:

123456789101112131415161718192021222324252627282930313233343536373839404142
#include <iostream>#include <string>#include <unordered_map>using namespace std;int main(){        int n;        string s, p;        cin >> s;        cin >> p;        n = s.size();        unordered_map<char, int> need, curr;        for (char ch : p)                need[ch]++;        int left = 0, right = 0;        int curr_valid = 0, need_valid = need.size();        while (right < n) {                char ch = s[right];                curr[ch]++;                if (curr[ch] == need[ch])                        curr_valid++;                right++;                while (curr_valid == need_valid) {                        char ch = s[left];                        if (right - left == p.size())                                cout << left << ' ';                        if (curr[ch] == need[ch])                                curr_valid--;                                                curr[ch]--;                        left++;                }        }}
Loading comments…