Substring with Concatenation of All Words

题目描述

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).

分析：

class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
map<string, int> words;
map<string, int> curWords;
vector<int> ret;
int slen = S.length();
if (!slen || L.empty()) return ret;
int llen = L.size(), wlen = L[0].length();
for(int i=0;i<L.size();i++)
//计算字符串对应的key值
++words[L[i]];
// check the [llen * wlen] substring
for (int i = 0; i + llen * wlen <= slen; i++)
{
curWords.clear();
int j = 0;
// check the words
for (j = 0; j < llen; j++)
{
string tmp = S.substr(i + j * wlen, wlen);
if (words.find(tmp) == words.end())
break;
++curWords[tmp];
if (curWords[tmp] > words[tmp])  //防止S中重复单词出现
break;
}
if (j == llen)  //从i位置已经找到了L中的单词；
ret.push_back(i);
}
return ret;
}
};