题目:
You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.
For example, given:
s: "barfoothefoobarman"
words: ["foo", "bar"]
You should return the indices: [0,9]
.
(order does not matter).
这题涉及search,用hash表数据结构比较快,扫描s,逐个去跟words里的单词匹配,若匹配当前下表i就是一个可行的结果
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
unordered_map<string, int> word;
for(string s : words) word[s]++;
vector<int> ans;
int n = s.size(), m = words[0].size(), k = words.size();
for(int i = 0; i < n - m * k + 1; i++)
{
unordered_map<string, int> seen;
int j = 0;//这里写在外面方便 检验if(j == k * m)
for(; j < m * k; j+=m)
{
string jword = s.substr(i + j, m);//i + j not j
if(word.count(jword)){
seen[jword]++;//直接++
if(seen[jword] > word[jword])
break;
}
else break;
}
if(j == k * m)
ans.push_back(i);
}
return ans;
}
};