【leetcode】Find All Anagrams in a String

【leetcode】438. Find All Anagrams in a String

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".

Subscribe to see which companies asked this question

思路:

运用hash表,用一个hash表h1统计字符串p中的元素,用另一个hash表h2统计字符串s中的元素,设p中的元素个数是m个,则h2只统计连续的m个元素。所以当坐标>=i时,每往后遍历一个元素,先前的元素也要减一个。

代码如下:

 1 class Solution {
 2 public:
 3     vector<int> findAnagrams(string s, string p) {
 4         vector<int>ans;
 5         int freq[26]={0};
 6         for(char c:p)
 7             freq[c-'a']++;
 8         for(int l=0,r=0,cnt=0;r<s.size();++r)
 9         {
10             if(r-l==p.length() && ++freq[s[l++]-'a']>0)
11                 cnt--;
12             if(freq[s[r]-'a']-->0 && ++cnt==p.length()) 
13                 ans.push_back(l);
14         }
15         return ans;
16     }
17 };
原文地址:https://www.cnblogs.com/SarahLiu/p/5999348.html