当前位置: 首页 > news >正文

成功网站管理系统淘宝客网站如何做

成功网站管理系统,淘宝客网站如何做,本地app制作公司,凡科网怎么做网站LeetCode 76:最小覆盖子串问题定义与核心挑战 给定字符串 s 和 t,需找到 s 中包含 t 所有字符(含重复)的最短子串。若不存在则返回空字符串。核心难点: 字符匹配的精确性:t 中重复字符需在子串中对应数量匹…

LeetCode 76:最小覆盖子串

在这里插入图片描述

问题定义与核心挑战

给定字符串 st,需找到 s 中包含 t 所有字符(含重复)的最短子串。若不存在则返回空字符串。核心难点:

  1. 字符匹配的精确性t 中重复字符需在子串中对应数量匹配(如 t="AA",子串需至少含 2 个 A)。
  2. 高效区间搜索:直接枚举所有子串(O(n²))会超时,需通过 滑动窗口(双指针) 优化。

核心思路:滑动窗口 + 哈希表

利用 双指针(左 left、右 right 维护动态窗口,结合 哈希表 跟踪字符频率:

  1. 扩展右指针:扩大窗口,记录字符频率,直到窗口包含 t 所有字符。
  2. 收缩左指针:在窗口合法时,尝试左移缩小窗口,更新最小子串。
  3. 哈希表优化:通过 formed 变量快速判断窗口是否合法(无需每次遍历哈希表)。

算法步骤详解

步骤 1:预处理 t 的字符频率
  • 用哈希表 countT 记录 t 中每个字符的出现次数。
  • 计算 requiredt不同字符的数量(窗口需匹配这些字符的频率)。
Map<Character, Integer> countT = new HashMap<>();
for (char c : t.toCharArray()) {countT.put(c, countT.getOrDefault(c, 0) + 1);
}
int required = countT.size();
步骤 2:初始化滑动窗口变量
  • left=0:窗口左边界。
  • right=0:窗口右边界。
  • formed=0:当前窗口中满足 t 频率要求的字符数(如 t="ABC",窗口含 ABC 各至少 1 个时,formed=3)。
  • windowCounts:记录当前窗口内字符的频率。
  • minLen=∞start=0:记录最小窗口的长度和起始位置。
Map<Character, Integer> windowCounts = new HashMap<>();
int left = 0, formed = 0;
int minLen = Integer.MAX_VALUE;
int start = 0;
步骤 3:扩展右指针,构建窗口

遍历 s 的每个字符(右指针 right 移动):

  1. 更新窗口频率:将 s[right] 加入 windowCounts
  2. 判断是否满足频率要求:若 s[right]countT 中,且 windowCounts 中其频率等于 countT 中的频率,则 formed++
  3. 当窗口合法(formed == required),尝试收缩左指针
for (int right = 0; right < s.length(); right++) {char c = s.charAt(right);// 更新窗口频率windowCounts.put(c, windowCounts.getOrDefault(c, 0) + 1);// 若当前字符是t的目标字符,且频率刚满足要求,formed加1if (countT.containsKey(c) && windowCounts.get(c).intValue() == countT.get(c).intValue()) {formed++;}// 窗口合法时,收缩左指针while (formed == required) {// 更新最小窗口int currentLen = right - left + 1;if (currentLen < minLen) {minLen = currentLen;start = left;}// 收缩左指针:移除s[left]char leftChar = s.charAt(left);windowCounts.put(leftChar, windowCounts.get(leftChar) - 1);// 若移除后,该字符频率不再满足t的要求,formed减1if (countT.containsKey(leftChar) && windowCounts.get(leftChar).intValue() < countT.get(leftChar).intValue()) {formed--;}left++; // 左指针右移}
}
步骤 4:返回结果

若找到合法窗口(minLen 未被更新为 ),则截取 s[start, start+minLen);否则返回空字符串。

return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);

关键逻辑解析

  1. formed 变量的作用
    避免每次检查整个 windowCounts 是否匹配 countTO(m) 时间,mt 的不同字符数),而是通过 formed 实时跟踪已满足频率要求的字符数,达到 O(1) 判断窗口合法性。

  2. 收缩左指针的条件
    仅当窗口合法(formed == required)时,才尝试收缩,确保每次收缩都在合法区间内进行,避免遗漏更短的合法窗口。

  3. 字符频率的精确匹配
    仅当 windowCounts[c] 恰好等于 countT[c] 时,formed 才增加;收缩时,若 windowCounts[c] 小于 countT[c]formed 才减少。这保证了 formed 仅统计完全满足频率要求的字符。

完整代码(Java)

import java.util.HashMap;
import java.util.Map;class Solution {public String minWindow(String s, String t) {// 步骤1:预处理t的字符频率和requiredMap<Character, Integer> countT = new HashMap<>();for (char c : t.toCharArray()) {countT.put(c, countT.getOrDefault(c, 0) + 1);}int required = countT.size();// 滑动窗口变量初始化Map<Character, Integer> windowCounts = new HashMap<>();int left = 0, formed = 0;int minLen = Integer.MAX_VALUE;int start = 0;// 步骤2:扩展右指针,构建窗口for (int right = 0; right < s.length(); right++) {char c = s.charAt(right);// 更新窗口内字符频率windowCounts.put(c, windowCounts.getOrDefault(c, 0) + 1);// 若当前字符是t的目标字符,且频率刚满足要求,formed加1if (countT.containsKey(c) && windowCounts.get(c).intValue() == countT.get(c).intValue()) {formed++;}// 窗口合法时,收缩左指针while (formed == required) {// 更新最小窗口int currentLen = right - left + 1;if (currentLen < minLen) {minLen = currentLen;start = left;}// 收缩左指针:移除s[left]char leftChar = s.charAt(left);windowCounts.put(leftChar, windowCounts.get(leftChar) - 1);// 若移除后,该字符频率不再满足t的要求,formed减1if (countT.containsKey(leftChar) && windowCounts.get(leftChar).intValue() < countT.get(leftChar).intValue()) {formed--;}left++; // 左指针右移}}// 步骤3:返回结果return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);}
}

示例验证(以示例 1 为例)

输入s = "ADOBECODEBANC", t = "ABC"
推导过程

  1. 预处理countT = {'A':1, 'B':1, 'C':1}required=3
  2. 右指针扩展
    • right=5(字符 C),窗口 [0,5]ADOBEC):windowCountsA:1, B:1, C:1formed=3,进入收缩阶段。
    • 收缩左指针到 left=3(字符 B),窗口 [3,5]BEC):长度 3,记录为候选。
    • 继续扩展右指针,最终找到窗口 [9,11]BANC),长度 4,为最小。

复杂度分析

  • 时间复杂度O(n),其中 ns 的长度。双指针各移动 n 次,哈希表操作均为 O(1)
  • 空间复杂度O(m)mt 中不同字符的数量(最多 26 个字母,故为 O(1))。

该方法通过 滑动窗口 + 哈希表 高效解决了最小覆盖子串问题,核心在于动态维护窗口的合法性,并通过 formed 变量优化判断逻辑,确保了线性时间复杂度。

http://www.dtcms.com/a/421900.html

相关文章:

  • 如何让网站收录滨海企业做网站多少钱
  • 内部网站建设计划做网站必备
  • 网站域名管理权限wordpress 简洁 模板
  • 网站云解析域名解析crm客户关系管理系统源码
  • 网站备案授权书模板wordpress豆瓣主题
  • 自己做网站能宣传自己的产品吗网站建设与管理规划书
  • 在凡科做网站编辑上海知名网站开发公司
  • 大学个人网站期末作业上海市建设安全协会网站j
  • 精品课程网站建设 公司行业网站开发方案
  • 公司网站设计哪家公司好郑州专门做喷绘安装的网站
  • pc建站家电网站设计方案
  • 在线图片处理网站国家反诈中心app下载安卓版
  • 例点估算网站开发项目工作量万能素材网站下载
  • 网站如何跳转网站的关键词推扩是怎样做
  • 新手如何做网站维护做挂广告网站
  • 济南网站建设方案书范文金融行业高端网站制作
  • 南城网站建设公司策划平台网站建设源码
  • 网站建设收费标准不一烟台专业的网站建站公司
  • wordpress h1做搜狗pc网站优化排
  • dw班级网站建设网站的分析
  • 嘉兴专业网站建设网站建设平台方案
  • 怎样做好网站建设制作书签作文
  • 哪个网站可以看一级a做爰片t沃尔玛网上超市
  • 无锡网站网站建设门户网站有哪些类型
  • 网站建设难做吗可以做热图的在线网站
  • 佛山做网站优化公司襄阳机械加工网
  • 做瞹瞹嗳免费网站在线观看网站文字特效
  • 人和动物做的电影网站南通市住房城乡建设局网站
  • 网站设计基本要求上海公布最新情况
  • 仪征网站建设公司宿迁百度seo