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).
这道题用 naive 的方法解决。在 S 中滑动一个窗口,判断那个窗口中是否包含每个 L 中的 string。
用 STL Map,可以让问题变得简便。
class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
// Start typing your C/C++ solution below
// DO NOT write int main()
map<string,int> words;
map<string,int> current;
vector<int> result;
int numWord = L.size();
int length = L[0].length();
if(numWord==0) return result;
for(int i = 0; i<numWord; i++)
{
words[L[i]]++;
}
for(int i=0;i<=(int)S.length()-numWord*length;i++)
{
current.clear();
for(int j=0;j<numWord;j++)
{
string sub = S.substr(i+j*length,length);
if(words.find(sub)==words.end())
{
break;
}
current[sub]++;
if(current[sub]>words[sub])
{
break;
}
if(j==numWord-1)
{
result.push_back(i);
}
}
}
return result;
}
};