算法- 最小子字符串覆盖

绐 你 一 个 字 符 串 
、 一 个 字 符 串 t 。 返 回 s 中 还 盖 t 所 有 字 符 的 最 小 子 串 。 如 果 s 中 不 存 在 还 盖 t 所 有 字 符 的 子 串 , 则 返 回 空 字 符 串 
注 意 : 
. 对 于 t 中 重 复 字 符 , 我 们 寻 找 的 子 字 符 串 中 该 字 符 数 量 必 须 不 少 于 t 中 该 字 符 数 量 
. 如 果 s 中 存 在 这 样 的 子 串 , 我 们 保 证 它 唯 一 的 答 案 。 
示 例 1 : 
输 出 . 
示 例 2 : 
输 出 . 
示 例 3 . 
"ADOBECODEBANC" 
"BANC" 
t 
"ABC" 
解 释 : t 中 两 个 字 符 峪 , 均 应 包 含 在 s 的 子 串 中 , 
因 此 没 有 符 合 条 件 的 子 字 符 串 , 返 回 空 字 符 串

 

思路: 字符串移动匹配 寻找最小子串  滑动窗口 

 

滑动窗口思想: 给定窗口 左右边界 left right 固定left边界的情况下移动right边界,使得窗口内的数据满足条件,再固定right边界,移动left边界(使其刚好不满足条件),再固定left边界,再移动right边界 

 

解决步骤: 

 

1  移动左边界 left 直到满足包含 t 的条件 

 

2  左边界left 固定的情况下,移动右边界  right, 使滑动窗口不断缩小,将不必要的元素排除在外,直到遇到第一个必须包含的元素, 并记录左右边界的值 

 

3 固定右边界 ,移动左边界 left,使滑动窗口内字符串刚好不满足条件 ,,再执行步骤 1 

 

问题: 如何判断滑动窗口内包含了t 的全部元素: 

 

判断目标: 滑动窗口内出现的字符数量与t中对应字符数量是否一致 

  

条件: 滑动窗口右边界一定为 t 中字符(步骤2判断条件决定),只会在滑动窗口左边界出现多余字符 

  

问题一: 统计 t 中每个字符出现的次数 与 滑动窗口中的对应字符出现次数 

  

已知一: t中每个字符出现的次数已知,滑动窗口中字符出现的次数是变化的 

  

解决一: 由已知求未知,建立俩者之间的关系。滑动窗口中字符出现的次数可在左右边界变化时(做遍历)统计,在遍历过程中,与t中每个字符出现的次数建立关系,出现则次数减1,表示已包含该字符1次。在此过程中无需关心t中不包含的字符,则建立我们需要的滑动窗口中字符统计哈希表示。 

 字符统计哈希: key 为t中字符  value 为该字符在t中出现的次数减去在滑动窗口中出现次数 

  

问题二: 如何根据字符统计哈希,判断滑动窗口内包含了t的全部元素 

  

已知二:字符统计哈希中key与t中字符一致,则需要判断对应字符数量是否一致。根据问题一中的解决方案,value为0时,则该字符出现次数一致, 

 

解决二:需要判断哈希中字符value均为0 

  

问题三: 如何判读一个哈希中字符value均为0 

  

解决三:遍历或者计数,选择计数 

 

 

代码实现: 

 

 

 

posted @ 2022-03-26 22:02  简直😓  阅读(48)  评论(0编辑  收藏  举报