This question is pretty straight forward. Just need map STL.
#include <vector>
#include <string>
#include <unordered_map>
#include <iostream>
using namespace std;
/*
You are given a string, s and a list of words, that are all of the same length. Find all
starting indices of substrings in s that a concatenation of each word in words
exactly once and without any intervening characters.
For example:
Given: s "barfoothefoobarman", words ["foo", "bar"]. return indices[0, 9].
*/
vector<int> findSubstring(string s, vector<string>& words) {
unordered_map<string, int> wordCounts;
vector<int> res;
for(int i = 0; i < words.size(); ++i) {
wordCounts[words[i]]++;
}
int N = words.size();
if(N <= 0) return res;
int M = words[0].size();
for(int i = 0; i <= s.size() - N * M; ++i) {
unordered_map<string, int> currCounts;
int j = 0;
for(j = 0; j < N; ++j) {
string w = s.substr(i + j * M, M);
if(wordCounts.find(w) == wordCounts.end()) break;
currCounts[w]++;
if(currCounts[w] > wordCounts[w]) break;
}
if(j == N) res.push_back(i);
}
return res;
}
int main(void) {
string s = "barfoothefoobarman";
vector<string> words{"foo", "bar"};
vector<int> index = findSubstring(s, words);
for(int i = 0; i < index.size(); ++i) {
cout << index[i] << endl;
}
}