题目:
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 40,000.
The order of output does not matter.
思路:使用哈希表存储s子串和p中字符的个数,依次遍历s中的子串。本来想加上如果一旦出现p中不包含的字符,直接越过p的长度继续遍历s,没有成功。
class Solution {
public:
/*
* @param s: a string
* @param p: a string
* @return: a list of index
*/
vector<int> findAnagrams(string &s, string &p) {
// write your code here
int lens = s.size();
int lenp = p.size();
map<char, int> mp;
map<char, int> ms;
map<char, int>::iterator iter;
vector<int> res;
//初始化哈希表
for (int i = 0; i < lenp; i++) {
if (mp.find(p[i]) != mp.end()) {
mp[p[i]]++;
} else {
mp[p[i]] = 1;
}
}
for (int i = 0; i < lenp; i++) {
if (ms.find(s[i]) != ms.end()) {
ms[s[i]]++;
} else {
ms[s[i]] = 1;
}
}
//比较s子串与p是否为anagram
int flag = 0;
for (iter = mp.begin(); iter != mp.end(); iter++) {
if (ms.find(iter->first) == ms.end()) {
flag = 1;
}
if (ms[iter->first] != iter->second) {
flag = 1;
}
}
if (flag == 0) {
res.push_back(0);
}
for (int i = 1; i <= lens-lenp; i++) {
//更改哈希表
ms[s[i-1]]--;
if ( ms.find(s[i+lenp-1]) != ms.end() ) {
ms[s[i+lenp-1]]++;
} else {
ms[s[i+lenp-1]] = 1;
}
//比较s子串与p是否为anagram
flag = 0;
for (iter = mp.begin(); iter != mp.end(); iter++) {
if (ms.find(iter->first) == ms.end()) {
flag = 1;
}
if (ms[iter->first] != iter->second) {
flag = 1;
}
}
if (flag == 0) {
res.push_back(i);
}
}
return res;
}
};