1. 找到字符串中所有字母异位词
1.题目解析
比较易懂,不做解析。
2.算法思路
哈希表+滑动窗口+有效字符个数优化
创建两个哈希表,将p字符串存入哈希表2。
定义cnt存放有效字符个数。
进窗口:存入哈希表1,如果该元素在哈希1中的大小 小于在哈希2中的大小,说明是有效字符,cnt++。
判断:如果窗口的长度大于p.size(),出窗口。
出窗口:从哈希中删除,如果该元素在哈希1中的大小 小于在哈希2中的大小,说明是有效字符,cnt--。
更新结果:如果有效字符的个数正好是p.size()个就更新结果。
3.代码编写
vector<int> findAnagrams(string s, string p) {
int left = 0,right = 0;
int hash1[26] = {0};
int hash2[26] = {0};
int len = p.size();
vector<int>ans;
int count = 0;
for(int t : p)//将p存入hash2中
{
hash2[t-'a']++;
}
for(int left = 0,right = 0; right<s.size(); right++)
{
char in = s[right];
hash1[in-'a']++;//进窗口
if(hash1[in-'a'] <= hash2[in-'a'])//判断是不是有效字符
{
count++;
}
if(right - left + 1 > len)//判断是否出窗口
{
char out = s[left];
if(hash1[out-'a'] <= hash2[out-'a'])//判断是否是有效字符
{
count--;
}
hash1[out-'a']--;出窗口
left++;
}
if(count == len)//更新结果
{
ans.push_back(left);
}
}
return ans;
}