想了一下,想要考初试第一,太 tm 难了。我还是老老实实目标 360 好了。不要给自己那么大的压力,细水长流慢慢来就完事了。
cpp
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> count_s(26, 0);
vector<int> count_p(26, 0);
for ( auto& ch: p ) {
count_p[ch - 'a']++;
}
vector<int> ans;
int len_s = s.size();
int len_p = p.size();
if ( len_p > len_s ) {
return ans;
}
for ( int i = 0; i < len_p; i++ ) {
count_s[ s[i] - 'a' ]++;
}
if ( count_p == count_s ) {
ans.push_back( 0 );
}
for ( int i = len_p; i < len_s; i++ ) {
count_s[ s[i] - 'a' ]++;
count_s[ s[ i - len_p ] - 'a' ]--;
if ( count_p == count_s ) {
ans.push_back( i - len_p + 1 );
}
}
return ans;
}
};
需要调一下边界情况就好了。本质上是看,一个固定的滑动窗口内部,里面出现的字母的频次,是否完全相等,然后的话,如果我们把窗口滑动,窗口的左边,一定是要移出的,也就是对应代码里面的频次减少 1.
移出的下标是 i - len_p ,窗口的左边是 i - len_p + 1