自己做服务器和网站/无线网络优化工程师
链接: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;}
};