Leetcode 30. Substring with Concatenation of All Words (Hard) (cpp)
Tag: Hash Table, String, Two Pointers
Difficulty: Hard
/*
30. Substring with Concatenation of All Words (Hard)
You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.
For example, given:
s: "barfoothefoobarman"
words: ["foo", "bar"]
You should return the indices: [0,9].
(order does not matter).
*/
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
if (words.empty()) {
return{};
}
unordered_map<string, int> mapping;
for (string str : words) {
mapping[str]++;
}
vector<int> res;
int wsize = words[0].size();
for (int i = 0; i < wsize; i++) {
int wcnt = 0, slow = i, fast = i;
unordered_map<string, int> mapping2;
while (fast + wsize <= s.size()) {
string str = s.substr(fast, wsize);
if (mapping.find(str) == mapping.end()) {
mapping2.clear();
wcnt = 0;
slow = fast + wsize;
} else {
wcnt++;
mapping2[str]++;
while (mapping[str] < mapping2[str]) {
mapping2[s.substr(slow, wsize)]--;
wcnt--;
slow += wsize;
}
}
if (wcnt == words.size()) {
res.push_back(slow);
}
fast += wsize;
}
}
return res;
}
};