[Leetcode]Substring with Concatenation of All Words

No. 30, Substring with Concatenation of All Words

这个题其实一开始我都没明白什么意思。。。读了好几遍,发现是在s中找一个子串,这个子串里面包含words中的全部词,而且次数都跟words中一样,同时这个子串中不能含有其他多余的字符,输出符合要求的子串们的begin index。words中的词长度完全一样。

这道题目我采用了两个map,一个记录words中每个单词及它们出现的次数,另一个记录当前判断的子串中每个单词及它们出现的次数。Index从0开始遍历,一直到s.size()-wordNum*wordLen,因为后面的长度不足够产生这样的子串。将当前判断的子串按照words中单词的长度进行划分,如果出现了不在words中的单词或者当前某单词数量多于words中的数量,说明该Index不可能引导这样一个子串。

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        map<string,int> words_;
        map<string,int> cur;
        int wordNum=words.size();
        int wordLen=words[0].size();
        vector<int> result;
        for(int i=0;i<wordNum;i++){
            words_[words[i]]++;
        }
        for(int i=0;i<=(int)s.size()-wordNum*wordLen;i++){
            cur.clear();
            int j=0;
            for(;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)
                result.push_back(i);
        }
        return result;
    }
};

 

posted @ 2016-03-09 16:22  上官筱儿  阅读(121)  评论(0编辑  收藏  举报