给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
> 思路
***采用滑动窗口的做法
> 代码
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int len1 = s.size();
int len2 = p.size();
if(len1 < len2) return {};
unordered_map<char,int> mp_s;
unordered_map<char,int> mp_p;
for(const auto &c:p){
mp_p[c]++;
}
int l = 0;int r = 0;int valid = 0;
vector<int> res;
sort(p.begin(),p.end());
while(r < len1){
//扩大窗口
if(mp_p.count(s[r])){
mp_s[s[r]]++;
if(mp_p[s[r]] == mp_s[s[r]]){
valid++;
}
}
//满足条件 缩小窗口
while(r - l + 1 >= len2){
if(valid == mp_p.size()){
res.push_back(l);
}
if(mp_p.count(s[l])){
if(mp_p[s[l]] == mp_s[s[l]]){
valid--;
}
mp_s[s[l]]--;
}
l++;
}
r++;
}
return res;
}
};
标签:int,异位,++,valid,mp,438,字符串
From: https://www.cnblogs.com/lihaoxiang/p/17571258.html