https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words/
思路:滑动窗口 + 暴力匹配 ,还可以继续剪枝
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
if (words.size() == 0) {
return res;
}
//mp,bak一个用来统计string个数是否超出限制,另一个用来恢复每次迭代后的map结果
map<string, int> mp, bak;
int word_len = 0;
for (int i = 0; i < words.size(); i++) {
word_len = words[i].size();
mp[words[i]] += 1;
bak[words[i]] += 1;
}
for (int i = 0; i < s.size() - word_len * words.size() + 1; i++) {
int temp = 0;
int k = i;
for (int j = 0; j < words.size(); j++) {
string sub_s = "";
if (k + word_len < s.size() + 1) {
sub_s = s.substr(k, word_len);
if (mp[sub_s]) {
mp[sub_s] += 1;
k += word_len;
temp += 1;
} else {
break;
}
//剪枝,否则超时
if (mp[sub_s] > bak[sub_s] * 2) {
temp = 0;
break;
}
} else {
break;
}
}
for (int j = 0; j < words.size(); j++) {
mp[words[j]] = bak[words[j]];
}
if (temp == words.size()) {
res.push_back(i);
}
}
return res;
}