【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 };