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".
vector<int> findAnagrams(string s, string p) {
int lenp = p.length();
int lens = s.length();
vector<int> v;
bool flag = false;
int* i1 = new int[lenp];
for (int i = 0; i < lenp; i++){
i1[i] = p[i];
}
sort(i1, i1 + lenp);
for (int i = 0; i < lens; i++){
if (p.find(s[i]!=string::npos)){
int* i2 = new int[lenp];
for (int j = 0; j < lenp; j++){
i2[j] = s[i + j];
}
sort(i2, i2 + lenp);
for (int k = 0; k < lenp; k++){
if (i2[k] != i1[k]) { flag = false; break; }
flag = true;
}
if (flag){
v.push_back(i);
delete i2;
}
}
flag = false;
}
delete i1;
return v;
}
思路:转换成Int[],再进行排序。排序后比较是否为完全相同的数组。其中学习的知识点有(1)new动态分配后记得delete避免内存溢出 (2)p.find(s[i]!=string::npos为判断字符串是否包含某字符串语句
滑动窗法(sliding window):
vector<int> findAnagrams(string s, string p){
map<char, int> m;
vector<int> res;
int lenp = p.length();
int lens = s.length();
for (int i = 0; i < lenp; i++){
char tem = p[i];
if (m.count(tem) == 0)
//m.find(tem)!=m.end();
{
m.insert(pair<char, int>(tem, 0));
}
m[tem] ++;
}
int cnt = m.size();
int end = 0;
int start = 0;
for (end; end < lens; end++){
if (m.count(s[end])!=0){
m[s[end]]--;
if (m[s[end]] == 0){
cnt--;
}
}
while (cnt == 0){
if (m.count(s[start]) != 0){
if (m[s[start]] == 0) cnt++;
m[s[start]]++;
if ((end - start + 1) == lenp){
res.push_back(start);
}
}
start++;
}
}
return res;
}
原理另述