Description

Submission
Following is a tricky test case. Since the total length is obviously longer than the string s, the special case can be solved by checking (beg + words[0].size() * words.size()).

class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
if(words.empty()) return res;
map<string, int> dict;
for(auto word : words) {
auto iter = dict.find(word);
if(iter == dict.end()) {
dict.insert(make_pair(word, 1));
} else {
dict[word]++;
}
}
int l = words[0].size();
map<string, int> temp;
int count = 0;
int beg = 0;
for(int i = 0; i <= s.size();) {
string sub = s.substr(i, l);
auto dIter = dict.find(sub);
if(dIter == dict.end()) {
if(count > 0) {
i = beg + 1;
} else {
i++;
}
count = 0;
temp.clear();
} else {
auto tIter = temp.find(sub);
if(tIter == temp.end()) {
temp.insert(make_pair(sub, 1));
} else {
temp[sub]++;
}
if(count == 0) {
beg = i;
if(beg + l * words.size() > s.size()) break;
}
count++;
i += l;
if(temp[sub] > dict[sub]) {
temp.clear();
i = beg + 1;
count = 0;
} else if(count == words.size()) {
res.push_back(beg);
count = 0;
temp.clear();
i = beg + 1;
}
}
}
return res;
}
};
