leetCode_Substring with Concatenation of All Words

来源:互联网 发布:mac屏保设置不生效 编辑:程序博客网 时间:2024/06/05 09:28

题意:给定一个字符串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;}


0 0