LeetCode 438.找到字符串中所有字母异位词
思路🧐:
需要找到子串异位词,也就是只看该子串是否有相同字母而不管位置是否相同。分析题目发现只需要单调向前找异位词,则可以使用滑动窗口求解,注意这里每当左右边框长度大于p的长度时需要更新左边框,并且异位词可以用哈希表进行判断:
定义两个哈希表,一个s的哈希表,一个p的哈希表。通过分析题目,异位词不严格要求一一对应,则只需要判断p的字母是否在我们的子串中,我们可以再定义一个count,当插入时,p的哈希表<=s的哈希表,则该次插入是成功统计到p中的字母,count++;删除时,p的哈希表<=s的哈希表,则该次删除把成功统计的字母删了,count–。
最后,当count == len时,表示该子串中找到了异位词,将left插入到vector中即可。
代码🔎:
class Solution { public:vector<int> 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<int> 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;} };
时间复杂度:O(N) 空间复杂度:O(1)