算法- 最小子字符串覆盖
思路: 字符串移动匹配 寻找最小子串 滑动窗口
滑动窗口思想: 给定窗口 左右边界 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
解决三:遍历或者计数,选择计数
代码实现: