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; } };