思路:滑动窗口
提示一:两个hash的比较通过还款机制解决。
提示二:每次移动每个单词的长度mn,因此可以分组来解决:隔mn距离的为一组,一共有mn组,起点分别为0 1…mn-1。只要起点从这些位置开始,然后使用滑动窗口机制即可
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
int n = s.size(), m = words.size(), len = words[0].size(), tol = m * len;
unordered_map<string, int> hash, hash2;
vector<int> ans;
for (auto& s : words) hash2[s]++;
int cnt = 0;
for (int i = 0; i < len; ++i) { //分组,0->len-1为每一组
hash = hash2; //测试每一组的时候hash要是之前的hash2
int cnt = 0, l = i;
if (i + tol > n) break; //
for (int r = i; r + len <= n; r += len) {
string sl = s.substr(l, len), sr = s.substr(r, len);
if (r >= i + tol) {
if (hash.count(sl) && ++hash[sl] > 0) cnt--;
l += len;
}
if (hash.count(sr) && (--hash[sr] >= 0)) cnt++;
if (cnt == m) ans.push_back(l);
}
}
return ans;
}
};
易错点
1:当大于时break
2:测试每一组的时候hash要是之前的hash2