LeetCode 76. 最小覆盖子串
思路
暴力就是枚举终点 i
,找出里 i 最近的起点 j
,再去更新答案,可以发现起点随终点单调往后,因此可以滑动窗口优化
如何快速判断当前窗口是否包含子串所有字符
- 哈希表
word
存储子串所有字符出现的次数,window
存储当前窗口所有字符出现的次数 - 变量
cnt
记录当前窗口里,有效字符的个数 - 当
cnt
等于所有字符的出现次数时,表明已经包含子串, 尝试更新答案
维护变量 cnt
假设新增的字符为 c
- 如果
window[c]<word[c]
,cnt++;否则 cnt 不变,因为该字符已经冗余
代码
class Solution {
public:
unordered_map<char,int> hashatble,window;
string minWindow(string s, string t) {
for(auto i:t) hashatble[i]++;
string res;
for(int i=0,j=0,cnt=0;i<s.size();i++)
{
//维护窗口
window[s[i]]++;//右边界右移
if(window[s[i]]<=hashatble[s[i]]) cnt++;//更新cnt
while(window[s[j]]>hashatble[s[j]])//如果左边界是冗余的
{
window[s[j]]--;
j++;
}
//如果当前窗口包含了子串,则更新答案
if(cnt==t.size())
if(!res.size()||i-j+1<res.size())
res=s.substr(j,i-j+1);
}
return res;
}
};
有帮助的话可以点个赞,我会很开心的~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?