LeetCode热题 438.找到字符中所有字母异位词 (滑动窗口)
题目
思路:
这跟 无重复字符的最长子串 所用的算法是一样的,也是维护一个窗口(长度和 p 一样),然后比较这个窗口中的字母出现频率和 p 中字母出现的频率是否一致。然后动态维护的话,窗口每次移动,就把左边出窗的字母的频率减 1 ,后面加进来的字母的频率加 1。然后继续判断,一致就把当前窗口的起始点加进答案。
这里可能有疑问,就是怎么判断字母出现的频率是否一致,我们可以用两个vector,比如加进来一个 c,那我们就把 cnt[‘c’ - ‘a’] ++ ,然后比较就直接比较两个数组是否想等,因为 vector 重载了 operator==,所以可以直接比较两个数组是不是相同。
直接比较会先比较两个 vector 的 size()。如果长度相同,再逐元素调用对应类型的 operator==,直到出现不想等或者全部比对完。
代码:
int n = s.size(), len = p.size(); vector<int> ans;if (n < len) return ans; // 如果要找的异位词 比字符串还长,那就肯定没有vector<int> scnt(26), pcnt(26); // 一个是窗口里的字母频率计数,一个是目标词的字母频率// 初始化第一个窗口for (int i = 0; i < len; i ++ ){scnt[s[i] - 'a'] ++;pcnt[p[i] - 'a'] ++;}// 看是否一致if (scnt == pcnt) ans.push_back(0);// 右移窗口for (int i = 0; i < n - len; i ++ ){scnt[s[i] - 'a'] --;scnt[s[i + len] - 'a'] ++;if (scnt == pcnt) ans.push_back(i + 1);}return ans;