leetcode 438 找到字符串中所有的字母异位词
还是利用滑动窗口法解决,不断更新左右边界,找到符合的字符串,具体思路在代码中详细说明了
class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> result;int cmt[26]{};//定义一个全为0的26大小的静态数组,{}表示定义全为0for(int i = 0; i < p.size(); i++){//将p中每个出现的字母次数存起来cmt[p[i] - 'a']++;}int left = 0;for(int right = 0; right < s.size(); right++){//利用滑动窗户找出所有符合条件的char temp = s[right] - 'a';cmt[temp]--;//右边界不断右移,每移动一次将cmt中出现的次数减一,s中窗口右边界加纳入cmt中进行匹配while(cmt[temp] < 0){//如果出现次数小于0的,证明该字母在窗口中出现的次数大于p中出现的次数cmt[s[left] - 'a']++;//为了找到合适的,这时候需要窗口左边界右移,故此先将之前减去的效应加回来left++;//将left对应字母之前减去的效应加回来后,便可将左边界右移}//这个while的目的是,要知道我们维持的一直是一个动态的窗口,如果我们的左边界要右移,就说明最左边的数是不会纳入最后的匹配结果的,需要舍去,但之前又在cmt中减去了左边的数,所以在左边界右移时,一定得把减去的次数加回来if(right - left + 1 == p.size()){//直到窗口中的长度等于p的长度,便是找到了,result.push_back(left);//将左边界存入result中}}return result;}
};