LeetCode 30. 串联所有单词的子串
题目描述
给定一个字符串 s
和一些长度相同的单词 words
。找出 s
中恰好可以由 words
中所有单词串联形成的子串的起始位置。
注意子串要与 words
中的单词完全匹配,中间不能有其他字符,但不需要考虑 words
中单词串联的顺序。
示例1:
输入:
s = "barfoothefoobarman",
words = ["foo","bar"]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。
示例2:
输入:
s = "wordgoodgoodgoodbestword",
words = ["word","good","best","word"]
输出:[]
来源:力扣(LeetCode)
链接:[https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words](https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words
思路解析
使用一个哈希表来存储 words
中所有单次出现的次数,然后比较 s
的子串所构成的哈希表与 words
生成的哈希表,若相等,记录起点下标。
代码实现
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> result;
if(words.empty() || s.length() == 0) return result;
// Construct map
unordered_map<string, int> word_map;
for(auto word : words) word_map[word]++;
// Init variables
int word_length = words[0].length();
int str_length = word_length * words.size();
int max_start = s.length() - str_length + 1;
// Traverse the string and compare the hash map
for(int i = 0; i < max_start; i++) {
unordered_map<string, int> temp_map = word_map;
for(int j = 0; j < words.size(); j++) {
string temp_word = s.substr(i + j * word_length, word_length);
if(temp_map[temp_word] > 0) {
temp_map[temp_word]--;
if(temp_map[temp_word] == 0)
temp_map.erase(temp_word);
}
else
break;
}
if(temp_map.empty())
result.push_back(i);
}
return result;
}
};
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Huawei LiteOS基于Cortex-M4 GD32F4平台移植
· mysql8.0无备份通过idb文件恢复数据过程、idb文件修复和tablespace id不一致处