Title
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".
题目大意:就是返回所有的可以组成变位置序列的index
这个明显滑动窗口,但不能用map,用的vector,vector比较运算可以直接做,否则map一一比较就扩大复杂度了
Solution
//cpp:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> sv(256, 0), pv(256, 0), res;
if (p.size() > s.size()) {
return res;
}
for (int i = 0; i < p.size(); i++) {
sv[s[i]]++;
pv[p[i]]++;
}
if (pv == sv)
res.push_back(0);
for (int i = p.size(); i < s.size(); i++) {
sv[s[i]]++;
sv[s[i - p.size()]]--;
if (pv == sv)
res.push_back(i-p.size()+1);
}
return res;
}
};