首页 > 其他分享 >最小覆盖子串-滑动窗口

最小覆盖子串-滑动窗口

时间:2023-03-12 23:44:34浏览次数:31  
标签:子串 needs right 窗口 get window 滑动 left

BM90 最小覆盖子串

题目要求

image

思路分析

使用滑动窗口去解决此类问题。
滑动窗口思路:
- 初始化window窗口为长度为0
- 不断的将right指针向右移动 当window中包含所有的目标字符时则为初步完成
- 下一步进行优化,将left指针移动,也就是缩小窗口值,left向右移动
- 直到window不再满足时结束
说明:window是当前已经遍历了的存储结果,needs是我们需要的实际结果,只要window包含needs那么就是第一步完成。
总的来说主要有两个步骤:

  1. 先扩大窗口,直到window中包含所需的字符串
  2. 当满足条件时将左侧窗口进行收缩,直到left去除不满足后记录当前的len
    需要注意的是会有多次满足条件的时候,那么我们就需要每次在左侧收缩时将start和len记录下来,也就是当前的符合条件的子串长度。之后再次符合条件时进行判断,如果right-left<len的话则对start和len进行更新。

代码示例


/*
  @params {string} s
  @params {string} t
  @return {string}
  */
const minWindow = (s, t) => {
  // 将need和window初始化
  const needs = new Map()
  const window = new Map()
  for (let c of t) {
    needs.set(c, needs.has(c) ? needs.get(c) + 1 : 1)
  }
  // 初始化left和right指针,[left,right)
  let left = right = 0
  // 记录最小覆盖子串的起始索引
  let start = 0, len = Infinity

  // valid表示当前窗口中已经满足了几项值
  let valid = 0

  // 当right指针指向最后时跳出
  while (right < s.length) {
    const c = s[right]
    right++
    // 更新window窗口,必须要needs中包含当前内容才更新window窗口
    if (needs.has(c)) {
      if (window.has(c)) {
        window.set(c, window.get(c) + 1)
      } else {
        window.set(c, 1)
      }
      if (window.get(c) === needs.get(c)) valid++
    }


    // 判断window窗口是否需要收缩,也就是left是否需要向右移动
    // 如果当前window中满足的项数等于needs的长度那么则说明第一步完成
    while (valid === needs.size) {
      if (right - left < len) {
        start = left
        len = right - left
      }
      // 将window的最左侧移出窗口
      let d = s[left]
      // 缩小窗口
      left++
      // 进行窗口更新
      if (needs.get(d)) {
        if (window.get(d) === needs.get(d)) valid--
        window.set(d, window.get(d) - 1)
      }
    }

  }
  return len === Infinity ? '' : s.substr(start, len)

}

标签:子串,needs,right,窗口,get,window,滑动,left
From: https://www.cnblogs.com/zx529/p/17209783.html

相关文章

  • 3.无重复字符的最长子串
    这是属于滑动窗口的系列题目publicintlengthOfLongestSubstring(Strings){HashMap<Character,Integer>map=newHashMap<>();intmaxLen=0;/......
  • windows 文件夹打开默认是小窗口问题解决
    目录windows文件夹打开默认是小窗口问题解决问题解决windows文件夹打开默认是小窗口问题解决不知道误操作了什么,最近点击windows文件夹默认打开的都是小窗口,每次需要点......
  • 5.最长回文子串
    最长回文子串给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"......
  • 如何解决桌面窗口管理器占用过高
    以win11为例,win10差不多,请继续往下看看 那就开始吧一、启动控制面板1、在搜索栏输入“控制面板”然后鼠标左键单击控制面板【操作】鼠标左键单击Win图标在搜索栏输......
  • 消息处理:(窗口过程)
    //6.处理消息(窗口过程)LRESULTCALLBACKWindowProc( HWNDhWnd,//消息产生的窗口句柄 UINTMsg,//具体消息名称,WM_XXX消息名(消息名A)A代表鼠标等 WPARAMwParam,//键......
  • 句柄及窗口
    概念句柄类似指针地址,就是每个组件的身份,调用句柄相当于是调用组件屏幕和窗口坐标(0,0)在左上角参考什么是句柄......
  • MFC-GetWindowThreadProcessId获取指定窗口线程ID和进程ID
     HWNDhWnd=::FindWindow(NULL,_T("sss.txt-记事本"));DWORDdwTID=0;DWORDdwPID=NULL;dwTID=::GetWindowThreadProcessId(hWnd,&dwPID......
  • 无重复字符最长子串
    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度......
  • 解决Java调用BAT批处理不弹出cmd窗口
    常规调用方式:(这个肯定会弹出cmd窗口)Runtime.getRuntime().exec("cmd.exe/CstartD:\\test.bat");解决不弹框只需要“start”后面加一个参数“/b”就行:Runtime.......
  • 双指针:滑动窗口
    lc2379得到k个黑色快的最少operate说实话,滑动窗口还是见少了,知道有这个东西,一直没总结,刚看到题,自己还是很懵逼的,以为是dp,但是是简单题,都说用滑动窗口做,才有思路大概思......