class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> answer;
if(!s.length()) return answer;
int all=0;
int num=words[0].size();
int w = words.size();
int l =s.length();
map<string,int> m;
for(int i=0;i<w;i++){
all+=words[i].length();
m[words[i]]+=1;
}
if(l<all) return answer;
for(int start=0;start<num;start++){
map<string,int> new_m = m;
vector<string> n_s;
for(int i=start;i<=l-num;){
string t;
for(int k=0;k<num;k++) t+=s[i++];
n_s.push_back(t);
}
int num_ns = n_s.size();
if(num_ns < w) break;
for(int i=0;i<w;i++){
new_m[n_s[i]]-=1;
if(new_m[n_s[i]]==0) new_m.erase(n_s[i]);
}
if(new_m.empty()) answer.push_back(start);
for(int i=1;i<=num_ns-w;i++){
new_m[n_s[i-1]]+=1;
if(new_m[n_s[i-1]]==0) new_m.erase(n_s[i-1]);
new_m[n_s[i+w-1]]-=1;
if(new_m[n_s[i+w-1]]==0) new_m.erase(n_s[i+w-1]);
if(new_m.empty()) answer.push_back(start+i*num);
}
}
return answer;
}
};
假设每个单词长度为number,将字符串以0到number-1为起点作步长为number的分割,不足一个单词长度number的赘余舍去,然后依次作滑动窗口遍历,如果单词集合中有这个单词,则对应的数量减一,没有则加一,当单词集中没有单词了,自然表明该子串满足要求可行。