当前位置:软件学习 > Word >>

Leetcode: Substring with Concatenation of All Words

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中的单词在S中没有干扰词汇的连续出现就要记下来呢,提交发现不对,人家是each word in L exactly once.是要所有L中的词都出现一遍,中间不能有其他的干扰词汇。并且L中的词也会有重复。
错误代码:
 
 
vector<int> findSubstring(string S, vector<string> &L) {  
        // Note: The Solution object is instantiated only once.  
        set<string> dic;  
        for(int i = 0; i < L.size(); i++)  
            dic.insert(L[i]);  
  
        vector<int> res;  
        int wordlen = L[0].size();  
        set<string>::iterator it;  
        int i = 0;  
        bool isLastOk = false;  
        while(i < S.size())  
        {  
            string sub = S.substr(i,wordlen);  
            it = dic.find(sub);  
            if(it != dic.end())  
            {  
                if(!isLastOk)  
                {  
                    res.push_back(i);  
                    isLastOk = true;  
                }  
                    i += wordlen;  
            }else  
            {  
                isLastOk = false;  
                i++;  
            }  
        }  
        return res;  
    }  

 

 
 
正确代码如下:
 
vector<int> findSubstring(string S, vector<string> &L) {  
        // Note: The Solution object is instantiated only once.  
        map<string,int> words;  
        map<string,int> cur;  
        int wordNum = L.size();  
        for(int i = 0; i < wordNum; i++)  
            words[L[i]]++;  
        int wordLen = L[0].size();  
        vector<int> res;  
        //if(S.size() < wordLen*wordNum)return res;  
        for(int i = 0; i <= (int)S.size()-wordLen*wordNum; i++)  
        {  
            cur.clear();  
            int j;  
            for(j = 0; j < wordNum; j++)  
            {  
                string word = S.substr(i+j*wordLen, wordLen);  
                if(words.find(word) == words.end())  
                    break;  
                cur[word]++;  
                if(cur[word]>words[word])  
                    break;  
            }  
            if(j == wordNum)  
                res.push_back(i);  
        }  
        return res;  
    }  

 

 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,