需要找到子串异位词,也就是只看该子串是否有相同字母而不管位置是否相同。分析题目发现只需要单调向前找异位词,则可以使用滑动窗口求解,注意这里每当左右边框长度大于p的长度时需要更新左边框,并且异位词可以用哈希表进行判断:
定义两个哈希表,一个s的哈希表,一个p的哈希表。通过分析题目,异位词不严格要求一一对应,则只需要判断p的字母是否在我们的子串中,我们可以再定义一个count,当插入时,p的哈希表<=s的哈希表,则该次插入是成功统计到p中的字母,count++;删除时,p的哈希表<=s的哈希表,则该次删除把成功统计的字母删了,count–。
最后,当count == len时,表示该子串中找到了异位词,将left插入到vector中即可。
class Solution { public: vector
findAnagrams(string s, string p) { int hashs[26] = { 0 }; //s的哈希表 int hashp[26] = { 0 }; //p的哈希表 for(auto e : p) hashp[e - 'a']++; int count = 0; int len = p.size(); vector ret; for(int left = 0, right = 0; right < s.size(); right++) { hashs[s[right] - 'a']++; //如果插入时,s的哈希表的字母次数小于等于p,则为有效插入,count++ if(hashs[s[right] - 'a'] <= hashp[s[right] - 'a']) count++; //当左右边框距离大于p,表示后面不可能再出现异位词子串,则需要更新左边框 if(right - left + 1 > len) { //删除时,s的哈希表的字母次数小于等于p,则为有效删除,count-- if(hashs[s[left] - 'a'] <= hashp[s[left] - 'a']) count--; hashs[s[left++] - 'a']--; //减去字母次数,移动左边框 } if(count == len) ret.push_back(left); } return ret; } };