首先想到的解法时利用滑动窗口,每次匹配一个长度等于p字符串长度的s字符串的子串,然后进行判定,如果是,则将所在位置添加到数组中。
在判断两个字符串是否是字母异位词时,直接copy了之前的代码,整体代码如下:
cpp
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> v;
int size_s = s.size();
int size_p = p.size();
for(int i = 0; i <= size_s - size_p; i++){
string str(s, i, size_p);
if(isAnagram(str, p)){
v.push_back(i);
}
}
return v;
}
bool isAnagram(string s, string t) {
int record[26] = {0};
for (int i = 0; i < s.size(); i++) {
// 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
record[s[i] - 'a']++;
}
for (int i = 0; i < t.size(); i++) {
record[t[i] - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (record[i] != 0) {
// record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
return false;
}
}
// record数组所有元素都为零0,说明字符串s和t是字母异位词
return true;
}
};