483. 找到字符串中所有的字母异位词
一、简单分析
特殊情况:主串没有模式串长,那么肯定没有所谓的异位词了。
我们可以创建两个类似哈希表的数组,在一个窗口中,主串和模式串所对应的哈希数组相等,说明这个窗口中两则字符数量是相同的,也就满足异位词。
当然,移动窗口的过程中,主串上个窗口最左端的字符所对应哈希数组数组值-1,新窗口最右端的字符所对应的哈希数组值+1。
二、算法逻辑
- 创建两个哈希数组用来存储26字符
- 窗口还没移动时,起始位置为0,若满足两个数组相同,就保存
- 窗口移动时,主串上个窗口最左端的字符所对应哈希数组数组值-1,新窗口最右端的字符所对应的哈希数组值+1
三、代码逻辑
class Solution {
public:vector<int> findAnagrams(string s, string p) {//如果主串没有模式串长//2个计数数组分别存储26个字符,用来比较//一个数组用来保存结果//窗口没有移动时//比较两个计数数组,将起始位置0推入数组//每移动一步,主串最左端减1,最右端加1//比较两个计数数组,将起始位置推入数组}
};
完整代码
class Solution {
public:vector<int> findAnagrams(string s, string p) {int ssize = s.size();int psize = p.size();//如果主串没有模式串长if(ssize < psize){return vector<int> ();}//2个计数数组分别存储26个字符,用来比较vector<int> scount(26);vector<int> pcount(26);//一个数组用来保存结果vector<int> ans;//窗口没有移动时for(int i = 0; i < psize; i++){++scount[s[i] - 'a'];++pcount[s[i] - 'a'];}//比较两个计数数组,将起始位置0推入数组if(scount == pcount)ans.push_back(0);//每移动一步,主串最左端减1,最右端加1for(int i = 0; i < ssize - psize; i++){--scount[s[i] - 'a'];++scount[s[i + psize] - 'a'];//比较两个计数数组,将起始位置推入数组if(scount == pcount)ans.push_back(i + 1);}return ans;}
};