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中的单位长度为n,依次从S中取长度为n的子串,如果在L中,就记下来。需要借助hash或map,如果整个L都匹配完了,就算是一个concatenation;当匹配错误的时候,S右移一个位置。
参考链接:http://blog.csdn.net/ojshilu/article/details/22212703
代码:
class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
vector<int> res;
int n=L[0].size();
int len=n*L.size();
if(len>S.size())
return res;
map<string,int> m;
for(int i=0;i<L.size();i++)
m[L[i]]++;
int idx=0;
map<string,int> tmp;
while(idx<=S.size()-len){
bool flag=true;
tmp.clear();
for(int i=idx;i<=idx+n*(L.size()-1);i+=n){
string now=S.substr(i,n);
if(m.find(now)==m.end()){
flag=false;
break;
}
tmp[now]++;
if(tmp[now]>m[now]){
flag=false;
break;
}
}
if(flag==true)
res.push_back(idx);
idx++;
}
return res;
}
};