您的位置:首页 > 其它

leetCode_Substring with Concatenation of All Words

2016-09-07 12:52 369 查看
题意:给定一个字符串s和一个组等长的单词序列t,返回子串的开始坐标,子串为单词序列中所有单词的连接(只出现一次),顺序不重要。

例如:s="barfoothefoobarman" words:["foo","bar"] 返回的字典序列[0,9]

思路:非常简单,用map记录单词序列出现的次数,然后从每个index开始,看看t.size()*t[0].length()这个区间内是否把t所有的单词都出现了。【代码中有一个要注意】

注意优化:新开一个map表示子串中单词出现的个数,从0累加。不要首先将值复制一遍,出现一个单词减一个单词,这样会超时。

代码如下:

vector<int> findSubstring(string s, vector<string>& words)
{
vector<int> ans;
vector<vector<int> > indexes;
vector<int> isUsed;
map<string,int> wordsIndex;
vector<int> tempVector;
int i,j,k,t=0;
if(s.length()==0 || words.size()==0 || s.length()<words[0].length()*words.size()) return ans;
for(i=0;i<words.size();i++) wordsIndex[words[i]]++;
for(i=0;i<s.length()-words[0].length()*words.size()+1;i++)
{
map<string,int> temp;
t=min(i+words[0].length()*words.size(),s.length());
k=0;
for(j=i;j<t;j=j+words[0].length())
{
string ss=s.substr(j,words[0].length());
if(wordsIndex.find(ss)!=wordsIndex.end())
{
temp[ss]++;
k++;
if(temp[ss]>wordsIndex[ss])
{
k--;
break;
}
}
}
if(k==words.size()) ans.push_back(i);
}
return ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: