原题链接:30. 串联所有单词的子串
代码一:遍历,hash
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
int len=words[0].size();
int l=len*int(words.size());
if(s.size()<l || s.size()==0 ||words.size()==0)
return res;
unordered_map <string,int> m;
for(auto w:words)
m[w]++;
for(int i=0;i<=s.size()-l;i++)
{
string tmp=s.substr(i,len);
if(m[tmp]>0)
{
int pos=i;
unordered_map <string,int> m1;
while(m[tmp]+m1[tmp]>0)
{
m1[tmp]--;
pos+=len;
tmp=s.substr(pos,len);
}
if(pos-i==l)
res.push_back(i);
}
}
return res;
}
};
下面的这个代码更快一点,参考题解:Leecode 串联所有单词的子串
Leecode 串联所有单词的子串 多解法
代码二:滑动窗口+hash
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
int len=words[0].size();
int wl=len*int(words.size());
if(s.size()<wl || s.size()==0 ||words.size()==0)
return res;
unordered_map <string,int> m;
for(auto w:words)
m[w]++;
for(int i=0;i<len;i++)
{
int l=i,r=i,num=0;
unordered_map <string,int> m1;
while(r+len<=s.size())
{
string tmp=s.substr(r,len);
r+=len;
if(m.count(tmp)==0)
{
num=0;l=r;m1.clear();
}
else
{
m1[tmp]++;num++;
while(m1[tmp]>m[tmp])
{
string t1=s.substr(l,len);
num--;
m1[t1]--;
l+=len;
}
if(num==words.size())
res.push_back(l);
}
}
}
return res;
}
};