难度:Hard
标签:哈希表、字符串、滑动窗口
链接:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/description/
在B站上看见一个up的视频,感觉说的很清晰,言简意赅:【五分钟力扣 Leetcode 第30题 串联所有单词的子串除 Python入门算法刷题 极简解法 23行代码 97%】 。
看完视频后,我觉得关键点在于,可以通过比较两个哈希表是否“相等” 来判断子串是否满足要求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Solution { public: vector<int> findSubstring(string s, vector<string>& words) { int words_num = words.size(); int uni_len = words[0].size(); int n = s.size(); vector<int> res; unordered_map<string, int> dict; for (auto& w : words) { dict[w]++; } for (int i = 0; i < uni_len; i++) { int start = i; unordered_map<string, int> cache; for (int j = i; j < n; j += uni_len) { string sub = s.substr(j, uni_len); if (dict.find(sub) != dict.end()) { cache[sub]++; while (cache[sub] > dict[sub]) { string remove_str = s.substr(start, uni_len); cache[remove_str]--; start += uni_len; } if (dict == cache) { res.push_back(start); } } else { start = j + uni_len; cache.clear(); } } } return res; } };
|