没有看题解:先上代码在讲思路:
#include <iostream>
#include "algorithm"
#include "unordered_map"
#include "vector"
using namespace std;
vector<int> find(string s, string p) {
vector<int> v;
int slen = s.size();
int plen = p.size();
if(slen < plen) return v;
unordered_map<char,int> targetcount;
unordered_map<char,int> windowscount;//
for(auto& c:p){
targetcount[c]++;
}
for (int i = 0; i < plen; ++i) {
windowscount[s[i]]++;//构造一个长度为与字符串 ppp 的长度相同的滑动窗口,
}
for (int i = plen; i < slen; ++i) {
if (targetcount == windowscount){//当前窗口的长度等于目标异位词
v.push_back(i-plen);
}
char chartarget = s[i-plen];
if (windowscount[chartarget] == 1){//判断该char在该窗口是否自出现一次
windowscount.erase(chartarget);
}else{
windowscount[chartarget]--;
}
windowscount[s[i]]++;
}
if (windowscount == targetcount)//最后一个窗口检查
{
v.push_back(slen - plen);
}
return v;
}
int main() {
std::string s = "cbaebabacd";
std::string p = "abc";
vector<int> v = find(s, p);
for(const auto& c:v){
cout << c << endl;
}
return 0;
}
思路,使用了滑动窗口:
首先我们先开两个哈希表,用来记录后面的数据
1、我们需要初始化一个与目标字符串一样大小的窗口,接着我们需要遍历字符串s同时将字符添加到窗口里面
2、假如在这个窗口内他的长度和目标异位词的长度相同,那么我们就认为找到了且把初始位置存到一个数组里面
如果判断的长度大于目标长度那么我们就需要需要移除最左侧的字符,我们使用键值来判断这个字符在该窗口是不是只出现过一次,如果是我们就认为该字符不再是这个窗口的需要移除,否则我们就需要将其计数减1,以为出现了多次
可能写的不是很详细,大概跟官方题解差不多吧可能!