卡了好几天,这个问题,实际上很简单,说到底还是stl里的容器掌握的不熟练
类似窗口滑动,每次去比较,这里有个技巧,假定字符串里都是26个英文字母。
// 438. Find All Anagrams in a String (窗口滑动)
vector<int> Solution::findAnagrams(string s, string p)
{
vector<int> pv(26, 0), sv(26, 0); // s vector; p vector
vector<int>res;
if (s.size() < p.size())
return res;
// 初始化
for (int i = 0; i < p.size(); ++i)
{
int index_p = p[i] - 'a';
int index_s = s[i] - 'a';
++pv[index_p];
++sv[index_s];
}
if (pv == sv)
res.push_back(0);
for (int i = p.size(); i < s.size(); ++i)
{
// 每次向右滑动窗口,新加一个元素,同时要移除前一个元素,然后每次比较两个vector
++sv[s[i] - 'a'];
--sv[s[i - p.size()] - 'a'];
if (sv == pv)
res.push_back(i - p.size() + 1);
}
return res;
}
最后参考了下提示
Runtime: 32 ms, faster than 90.61% of C++ online submissions for Find All Anagrams in a String.
Memory Usage: 10.2 MB, less than 100.00% of C++ online submissions for Find All Anagrams in a String.