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).
错误代码:
vector<int> findSubstring(string S, vector<string> &L) {
// Note: The Solution object is instantiated only once.
set<string> dic;
for(int i = 0; i < L.size(); i++)
dic.insert(L[i]);
vector<int> res;
int wordlen = L[0].size();
set<string>::iterator it;
int i = 0;
bool isLastOk = false;
while(i < S.size())
{
string sub = S.substr(i,wordlen);
it = dic.find(sub);
if(it != dic.end())
{
if(!isLastOk)
{
res.push_back(i);
isLastOk = true;
}
i += wordlen;
}else
{
isLastOk = false;
i++;
}
}
return res;
}
正确代码如下:
vector<int> findSubstring(string S, vector<string> &L) {
// Note: The Solution object is instantiated only once.
map<string,int> words;
map<string,int> cur;
int wordNum = L.size();
for(int i = 0; i < wordNum; i++)
words[L[i]]++;
int wordLen = L[0].size();
vector<int> res;
//if(S.size() < wordLen*wordNum)return res;
for(int i = 0; i <= (int)S.size()-wordLen*wordNum; i++)
{
cur.clear();
int j;
for(j = 0; j < wordNum; j++)
{
string word = S.substr(i+j*wordLen, wordLen);
if(words.find(word) == words.end())
break;
cur[word]++;
if(cur[word]>words[word])
break;
}
if(j == wordNum)
res.push_back(i);
}
return res;
}