Question

Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.

Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.

The order of output does not matter.

Example 1:

**Input:**
s: "cbaebabacd" p: "abc"

**Output:**
[0, 6]

**Explanation:**
The substring with start index = 0 is "cba", which is an anagram of "abc".
The substring with start index = 6 is "bac", which is an anagram of "abc".

Example 2:

**Input:**
s: "abab" p: "ab"

**Output:**
[0, 1, 2]

**Explanation:**
The substring with start index = 0 is "ab", which is an anagram of "ab".
The substring with start index = 1 is "ba", which is an anagram of "ab".
The substring with start index = 2 is "ab", which is an anagram of "ab".

Difficulty:Easy

Category:Hash-Table

Analyze

Solution

class Solution {
 public:
  vector<int> findAnagrams(string s, string p) {
    vector<int> count(26, 0), rec(26, 0), ans;
    int len = p.length();
    for (char& c : p) ++count[c - 'a'];
    for (int i = 0; i < s.length(); ++i) {
      if (i >= len) --rec[s[i - len] - 'a'];
      ++rec[s[i] - 'a'];
      // Check the equal
      if (rec == count) ans.emplace_back(i - len + 1);
    }
    return ans;
  }
};
By guozetang            Updated: 2020-09-19 13:02:30

results matching ""

    No results matching ""