15. 串联所有单词的子串
题目链接
题目描述

题目示例

解法思路
算法思路
- 如果我们把每一个单词看成一个个字母,问题就变成了找到【字符串中所有的字母的异位词】。无非就是之前处理的对象是一个个字符,我们这里处理的对象是一个一个的单词。
有以下几点不同:
- 哈希表需要使用
hash<string,int> - left 和 right 移动的步长是单词的长度 (len)
- 滑动窗口执行的次数也是 len 次
代码实现
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
// 解法:滑动窗口 + 哈希表 (容器)
vector<int> ret;
unordered_map<string, int> hash1; // 统计 words 中所有单词出现的频次
for(auto e : words) {
hash1[e]++;
}
int len = words[0].size(); // len 为 words 中每个字符串的长度
int m = words.size(); // m 为 words 的长度
int left = ;
right = ;
( i = ; i < len; i++) {
unordered_map<string, > hash2;
count = ;
left = i;
(right = i; right + len <= s.(); right += len) {
string str1 = s.(right, len);
hash2[str1]++;
(hash2[str1] <= hash1[str1]) {
count++;
}
(right - left + > len * m) {
string str2 = s.(left, len);
(hash2[str2] <= hash1[str2]) {
count--;
}
hash2[str2]--;
left += len;
}
(count == m) {
ret.(left);
}
}
}
ret;
}
};








