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;
}
};