(代码题解来源于leetcode,非本人题解)
题解一:
参考题解:30. 串联所有单词的子串 - 力扣(LeetCode)
作者思路解析:思路一:单词长度固定,如为t,可以将字符串s按照固定长度t进行切割,存储哈希表,一个哈希表是利用字符串s截取后的各个单词,一个哈希表是输入的单词组,判断两者是否相等。此时,遍历和比较都是线性的,时间复杂度为O(n^2)
思路二:滑动窗口(python版本,没看)
题解二:
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
//基础判断 判断字符串与单词是否相等
int n=words[0].size();//单词长度
int len=n*words.size();//所有单词总长度
if(s.size()<len) return {};
//将字符串数组创建一个哈希表容器
unordered_map<string,int> hash;
for(auto& s:words)
{
hash[s]++;
}
//
vector<int> ret;
unordered_map<string,int> temp;
for(int k=0;k<n;k++)
{
int i=k,j=k,re=0;
//i判断是否在字符串中
while(i<s.size())
{
//j控制移动
//j要在整个的字符串s中
//且每次循环只在一串固定长度(字符数组所有单词个数)中判定
if(j<s.size()&&j<i+len)
{
//提取长度为n的子字符串
string str=s.substr(j,n);
//j向前移动n个位置
j+=n;
//哈希表中增加该str中的次数
//temp哈希表是存储字符串的哈希表
temp[str]++;
//该字符串在s中出现的次数如果小于单词数组哈希表中出现的次数 那么就++
//re统计了不重复的单词数量
if(temp[str]<=hash[str]) re++;
}
//直到每个固定长度结束
else
{
//判定是否匹配
if(re==words.size()) ret.push_back(i);
//逐步减去temp中统计的re的次数,开启下一次循环
string str=s.substr(i,n);
i+=n;
if(temp[str]<=hash[str]) re--;
temp[str]--;
}
}
temp.clear();
}
return ret;
}
};
没看懂为什么要多起点??