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) { int nums = words.size(), n = s.length(), len = words[0].length(); vector<int> ret; unordered_map<string, int> count; for (string word : words) count[word]++; for (int i = 0; i < n - len * nums + 1; i++) { unordered_map<string, int> seen; int j = 0; for (; j < nums; j++) { string str = s.substr(i + j * len, len); if (count.find(str) != count.end()) { seen[str]++; if (seen[str] > count[str]) break; }else{ break; } } if(j == nums) ret.push_back(i); } return ret; } };