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).
Just a map. Copying the map is easier than re-constructing the map repeatedly.
class Solution {
public:
bool check(string S, map<string, int> table, int len) {
for (int i = 0; i < S.length(); i += len) {
string cur = S.substr(i, len);
map<string, int>::iterator it = table.find(cur);
if (it != table.end() && it->second > 0)
--it->second;
else
return false;
}
return true;
}
vector<int> findSubstring(string S, vector<string> &L) {
map<string, int> table;
vector<int> res;
int i, j, Lsize = L.size();
if (L.size() < 1)
return res;
int len = L[0].length();
for (i = 0; i < L.size(); ++i)
if (table.find(L[i]) != table.end())
++table[L[i]];
else
table.insert(make_pair(L[i],1));
for (i = 0; i < S.length(); ++i) {
if (i + len*Lsize > S.length())
break;
string cur = S.substr(i, len*Lsize);
if (check(cur, table, len))
res.push_back(i);
}
return res;
}
};