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).
class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L)
{
vector<int> res;
if (S.size() == 0 || L.size() == 0) return res;
int size = L.size()*L[0].size();
if (S.size()<size) return res;
for (int i=0;i<=S.size()-size;i++)
if (isone(S.substr(i), L))
res.push_back(i);
return res;
}
bool isone(string S, vector<string> L)
{
if (L.size() == 0) return true;
int size = L[0].size();
vector<string>::iterator iter;
for(int i=0;i<L.size();i++)
{
iter = find(L.begin(),L.end(),S.substr(0, size));
if (iter == L.end())
return false;
else
{
L.erase(iter);
return isone(S.substr(size), L);
}
}
return false;//这里返回时因为网页编译报错
}
};
测试
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L)
{
vector<int> res;
if (S.size() == 0 || L.size() == 0)
return res;
int size = L.size()*L[0].size();
if (S.size()<size)
return res;
for (int i=0;i<=S.size()-size;i++)
{
if (isone(S.substr(i), L))
res.push_back(i);
}
return res;
}
bool isone(string S, vector<string> L)
{
if (L.size() == 0)
return true;
int size = L[0].size();
string tmp = S.substr(0, size);
vector<string>::iterator iter;
for(int i=0;i<L.size();i++)
{
iter = find(L.begin(),L.end(),tmp);
if (iter == L.end())
return false;
else
{
L.erase(iter);
return isone(S.substr(size), L);
}
}
return false;
}
};
int main()
{
Solution s;
string S = "barfoothefoobarman";
vector<string> vec;
vec.push_back("foo");
vec.push_back("bar");
vector<int> res = s.findSubstring(S, vec);
for(int i=0;i<res.size();i++)
cout<<res[i]<<endl;
cout<<endl;
return 0;
}