You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without any intervening characters.
For example, given:
S: "barfoothefoobarman"
L: ["foo", "bar"]
You should return the indices: [0,9]
.
(order does not matter).
思路:是一道维护一个动态窗口的题目,维护一个[start, end)的窗口来包含L中的串,每次移动的单位都是len(L的串都是同样大小的)
class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
map<string, int> wordTimes;
for (int i = 0; i < L.size(); i++) {
if (wordTimes.count(L[i]) == 0)
wordTimes[L[i]] = 1;
else wordTimes[L[i]]++;
}
int len = L[0].size();
vector<int> res;
for (int i = 0; i < len; i++) {
map<string, int> curTimes;
int start = i, cnt = 0;
for (int end = i; end <= (int)S.size()-len; end += len) {
string word = S.substr(end, len);
if (wordTimes.find(word) != wordTimes.end()) {
if (curTimes.find(word) == curTimes.end())
curTimes[word] = 1;
else curTimes[word]++;
if (curTimes[word] <= wordTimes[word])
cnt++;
else {
for (int k = start; ; k += len) {
string tmp = S.substr(k, len);
curTimes[tmp]--;
if (tmp == word) {
start = k + len;
break;
}
cnt--;
}
}
if (cnt == L.size())
res.push_back(start);
} else {
start = end + len;
curTimes.clear();
cnt = 0;
}
}
}
return res;
}
};