问题描述 :
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
示例 1:
输入:
s = “barfoothefoobarman”,
words = [“foo”,“bar”]
输出:0 9
解释:
从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。输出时,按照索引由小到大顺序输出。
示例 2:
输入:
s = “wordgoodgoodgoodbestword”,
words = [“word”,“good”,“best”,“word”]
输出:-1
s中的子串无法由words串联得到,所以输出-1
输入说明 :
首先收入字符串s,
然后输入words中单词的数目n,
最后输入n个字符串,表示words中的单词
输出说明 :
按照索引由小到大顺序输出,或者输出-1.
输入范例 :
barfoothefoobarman
2
foo bar
输出范例 :
0 9
#include<iostream>
#include<string.h>
#include<vector>
#include<map>
using namespace std;
vector<int> findSubstring(string s,vector<string> &words){
if (s == "" || words.size() == 0) return {};
map<string, int>hash;
vector<int>ans;
ans.clear();
int modelen = words[0].length(), len = s.length();
for (auto s: words) hash[s] ++;
auto tmp = hash;
string buff = "";
for (int i = 0; i < len; i++) {
if (len - i + 1 < modelen * words.size()) break;
tmp = hash;//将hash赋值给tmp
buff = s.substr(i, modelen);
int j = i, count = 0;
while (tmp[buff] > 0) {
-- tmp[buff];
count ++;
j += modelen;
buff = s.substr(j, modelen);
}
if (count == words.size()) {
ans.push_back(i);
}
}
return ans;
}
int main(){
string s,str;
vector<string> words;
int n;
cin>>s;
cin>>n;
for(int i=0; i<n; i++){
cin>>str;
words.push_back(str);
}
vector<int> res=findSubstring(s, words);
if (res.size()> 0)
for(int i=0; i<res.size(); i++){
if (i> 0)
cout<<" ";
cout<<res[i];
}
else
cout<<-1;
return 0;
}