30. 串联所有单词的子串
题目链接:30. 串联所有单词的子串文章来源:https://www.toymoban.com/news/detail-802149.html
代码如下:文章来源地址https://www.toymoban.com/news/detail-802149.html
//参考leetcode官方题解
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
int sLen=s.size(),wordsLen=words.size(),wordLen=words[0].size();
for(int i=0;i<wordLen&&i+wordLen*wordsLen<=sLen;i++)
{
unordered_map<string,int> differ;
//将该组第一个窗口内单词全部放入map中
for(int j=0;j<wordsLen;j++)
{
differ[s.substr(i+j*wordLen,wordLen)]++;
}
//计算第一个窗口的单词与单词表中单词的频次差
for(int i=0;i<words.size();i++)
{
if(--differ[words[i]] == 0)
differ.erase(words[i]);
}
//开始滑动窗口
for(int start=i;start<sLen-wordLen*wordsLen+1;start+=wordLen)
{
//非第一个窗口
if(start!=i)
{
string word=s.substr(start+(wordsLen-1)*wordLen,wordLen);
if(++differ[word]==0)
differ.erase(word);
//右边单词划出窗口
word=s.substr(start-wordLen,wordLen);
if(--differ[word]==0)
differ.erase(word);
}
if(differ.empty())
{
res.push_back(start);
}
}
}
return res;
}
};
到了这里,关于30. 串联所有单词的子串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!