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).
开两个哈希表,一个记录L中出现的词,一个记录搜索到的词,如果搜索到的词等于L中出现的词,就推入下标
提交了好多遍,每个字符都可能是开头,所以第一层循环是++i,这里一开始饶了不少弯路
class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
vector< int> res;
const int word_length = L[0].size();
const int words_length = word_length * L.size();
if( S.size() == 0 || S.size() < words_length)
return res;
unordered_map< string, int> appear;
unordered_map< string, int> expect;
int appear_time = 0;
for( int i = 0; i < L.size(); ++i)
++expect[L[i]];
int tmpi;
for( int i = 0; i < S.size() && S.size() - i >= words_length; ++i){
string tmp = S.substr( i, word_length);
if( expect[tmp] > 0){
for( int j = i; j < S.size(); j = j + word_length){
tmp = S.substr( j, word_length);
if( expect[tmp] > 0 && appear[tmp] < expect[tmp]){
++appear[tmp];
++appear_time;
}
else{
appear.clear();
appear_time = 0;
break;
}
if( appear_time == L.size()){
res.push_back(i);
appear.clear();
appear_time = 0;
break;
}
}
}
}
return res;
}
};