Following is an optiized solution in c++ following solution of Problem Challenge 1:
using namespace std;
#include
#include
#include <unordered_map>
#include
class WordConcatenation {
public:
static vector findWordConcatenation(const string &str, const vector &words) {
vector resultIndices;
if(str.length() == 0 || words.size() == 0) {
return resultIndices;
}
unordered_map<string,int> wordFreq;
for( auto w: words) {
wordFreq[w]++;
}
int wordCount = words.size();
int wordLen = words[0].length();
int wStart = 0;
int matched = 0;
for(int wEnd = 0; wEnd < str.length(); wEnd += wordLen) {
string word = str.substr(wEnd,wordLen);
if(wordFreq.find(word) != wordFreq.end()) {
wordFreq[word]--;
if(wordFreq[word]==0) {
matched++;
}
}
if(matched == wordFreq.size()) {
resultIndices.push_back(wStart);
}
if(wEnd + wordLen >= wordCount * wordLen - 1) {
string wordStart = str.substr(wStart, wordLen);
if(wordFreq[wordStart] == 0) {
matched--;
}
wordFreq[wordStart]++;
wStart += wordLen;
}
}
return resultIndices;
}
};
int main(int argc, char *argv[]) {
vector result =
WordConcatenation::findWordConcatenation(“catfoxcat”, vector{“cat”, “fox”});
for (auto num : result) {
cout << num << " ";
}
cout << endl;
result = WordConcatenation::findWordConcatenation(“catcatfoxfox”, vector{“cat”, “fox”});
for (auto num : result) {
cout << num << " ";
}
cout << endl;
}