滑动窗口7:30. 串联所有单词的子串
链接:30. 串联所有单词的子串 - 力扣(LeetCode)
滑动窗口基本解题思路:
- 进窗口
- 判断
- 出窗口
- 更新结果(该步骤顺序不固定,可能在进窗口时更新结果,也可能在判断成立时更新结果,也有可能在判断条件结束之后更新结果)
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> ans;
// 记录words中的单词
unordered_map<string, int> wCount;
for (auto& e : words) wCount[e] += 1;
int len = words[0].size();
int num = words.size();
//判断
if (len * num > s.size()) return ans;
// 记录滑动窗口中的单词
int n = s.size();
for (int i = 0; i < len; i++)
{
unordered_map<string, int> sCount;
for (int left = i, right = i, count = 0; right < n; right+=len)
{
//进窗口
string word1 = s.substr(right, len);
sCount[word1] += 1;
count++;
//判断
if (count > num)
{
//出窗口
string word2 = s.substr(left, len);
sCount[word2] -= 1;
if (sCount[word2] == 0) sCount.erase(word2);
left += len;
count--;
}
//更新结果
if (sCount == wCount) ans.emplace_back(left);
}
}
return ans;
}
};