虽然是easy标签,但是没想出来T T
看了discuss,学习了一个“滑动窗口”的求子串的求解方法
利用pv来保存 需要目标子串的所有字符出现次数
利用sv来保存 当前窗口下的子串的所有字符出现次数
以p.size()为窗口大小,在s上滑动,每次滑动比较pv sv是否相同,若相同则说明是目标子串,记录窗口起始位置。详细的看code吧
class Solution
{
public:
vector<int> findAnagrams(string s, string p)
{
vector<int> pv(26, 0);
vector<int> sv(26, 0);
vector<int> res;
if (s.size() < p.size())
return res;
for (int i = 0; i < p.size(); i++)
{
++pv[p[i] - 'a'];
++sv[s[i] - 'a'];
}
if (pv == sv)
res.push_back(0);
for (int i = p.size(); i < s.size(); i++)
{
++sv[s[i] - 'a'];
--sv[s[i - p.size()] - 'a'];
if (sv == pv)
res.push_back(i - p.size() + 1);
}
return res;
}
};