营销软文网站实力app开发公司
2026/1/24 5:11:04 网站建设 项目流程
营销软文网站,实力app开发公司,南通企业自助建站,wordpress4.7优化这道题是 Hard 级别#xff0c;也是无数面试者的噩梦。 前面的题#xff08;水果成篮、无重复子串#xff09;都是窗口**“大了才缩”。 这道题反过来#xff1a;窗口“不够大#xff08;没凑齐#xff09;就一直扩#xff0c;一旦凑齐了就拼命缩”#xff0c;试图找到…这道题是Hard级别也是无数面试者的噩梦。 前面的题水果成篮、无重复子串都是窗口**“大了才缩”。 这道题反过来窗口“不够大没凑齐就一直扩一旦凑齐了就拼命缩”试图找到最小**的那个解。力扣 76. 最小覆盖子串https://leetcode.cn/problems/minimum-window-substring/题目分析输入字符串s(资源池), 字符串t(需求清单)。目标在s中找到一个最短的子串包含t中所有的字符包括重复字符比如tAA, 子串里也得有两个A。输出这个最短子串。如果不存在返回空字符串。例子s ADOBECODEBANC,t ABC一直扩窗口一直向右直到变成ADOBEC。此时包含了 A, B, C。这是一个可行解但太长了。尝试缩左边A移出去不行A 也是必须的。继续跑...直到找到BANC包含 A, B, C且长度只有 4。核心思维两个哈希表 有效计数器这道题单纯用 Map 会比较乱我们需要维护两个概念needMap记录t中每个字符需要多少个。 (比如A:1, B:1, C:1)windowMap记录当前窗口里已经有多少个字符。valid变量记录有多少个字符已经**“达标”**了。比如t需要A1个。当窗口里A的数量从 0 变成 1 时valid。当valid等于need.size时说明所有种类的字符都凑齐了操作逻辑进窗口 (right)读字符更新windowMap。如果window[c] need[c]说明这个字符凑够了valid。收缩窗口 (left)While (valid need.size)只要凑齐了就一直缩更新结果如果当前窗口更短记录下来。踢出字符把s[left]移出窗口。关键判断如果移出的字符导致window[c] need[c]说明不再达标了valid--。left。代码实现 (JavaScript)JavaScript/** * param {string} s * param {string} t * return {string} */ var minWindow function(s, t) { // 1. 统计需求 t const need new Map(); for (const c of t) { need.set(c, (need.get(c) || 0) 1); } const window new Map(); let left 0, right 0; let valid 0; // 记录有多少种字符已经满足要求了 // 记录最小子串的起始位置和长度 let start 0; let minLen Infinity; while (right s.length) { // --- 进窗口 --- const c s[right]; right; // 右指针移动 // 如果这个字符是我们需要关注的 if (need.has(c)) { window.set(c, (window.get(c) || 0) 1); // 如果窗口里的数量刚刚好达到了需求valid 1 if (window.get(c) need.get(c)) { valid; } } // --- 出窗口 --- // 当 valid 等于 need 的大小时说明所有字符都凑齐了 // 这时候开始尝试收缩左边界寻找“最小” while (valid need.size) { // 更新最小覆盖子串 if (right - left minLen) { start left; minLen right - left; } // 准备移出左边的字符 const d s[left]; left; // 如果移出的字符是我们需要关注的 if (need.has(d)) { // 如果移出前数量刚好达标。那移出后肯定就不达标了 if (window.get(d) need.get(d)) { valid--; } window.set(d, window.get(d) - 1); } } } return minLen Infinity ? : s.substr(start, minLen); };深度辨析为什么是window.get(c) need.get(c)假设t AA,s AAAA。need {A: 2}。right读第一个 A:window{A:1}。不等于 2valid 不变。right读第二个 A:window{A:2}。等于 2valid(A 达标了)。right读第三个 A:window{A:3}。不等于 2valid 不变。结论valid只在“刚刚好满足”的那一瞬间增加。这保证了即使窗口里有 100 个 Avalid也只算一次。总结拿下这道题不定长滑动窗口这一块你就彻底毕业了。 它的模板是所有滑动窗口里最全的Map 统计需求。valid变量判断状态。while(valid target)进行收缩优化。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询