思路
写在前面:本题按照y总思路,用图解模拟了样例的输入输出,以达到更好的理解,建议先看一遍y总视频
- tot : 记录有效单词的哈希表
- wd: 滑动窗口的哈希表
- cnt: 有效单词的个数
- n : s的长度
- m: words的长度,即单词个数
- w : words[0]的长度,即单词的长度
- i: 范围从
0
-w-1
, 代表枚举每一组 - j :代表每组的所有元素
ac代码
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
if (words.empty()) return res;
int n = s.size(), m = words.size(), w = words[0].size();
unordered_map<string, int> tot;
for (auto& word : words) tot[word] ++ ;
for (int i = 0; i < w; i ++ ) {
unordered_map<string, int> wd;
int cnt = 0;
for (int j = i; j + w <= n; j += w) {
if (j >= i + m * w) {
cout<<"j = "<<j<<endl;
auto word = s.substr(j - m * w, w);
wd[word] -- ;
if (wd[word] < tot[word]) cnt -- ;
}
auto word = s.substr(j, w);
wd[word] ++ ;
if (wd[word] <= tot[word]) cnt ++ ;
if (cnt == m)
{
cout<<"cnt == m, j = "<<j<<endl;
res.push_back(j - (m - 1) * w);
}
}
}
cout<<n<<endl<<m<<endl<<w<<endl;
return res;
}
};