Day 35

第76题:

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。来源:力扣(LeetCode)

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"

说明: 如果 S 中不存这样的子串,则返回空字符串 ""。

    如果 S 中存在这样的子串,我们保证它是唯一的答案。

1、如果使用暴力解法,遍历s,求出s的所有子串;

  将s的所有子串和t字符串来比较,得出包含t内所有字符的子串;

  然后再比较这些子串,得出最小子串。这样多出来许多没必要的比较;

  例如有一段很长的子串(abcdddfg)包含了t(cfg),但是这个子串的后面的部分(cdddfg)其实已经包含了t(cfg);

  那说明这整个子串(abcdddfg)其实是不用来比较的,而且(bcdddfg)这个子串也不必和t来比较;

 

2、所以就可以用滑动窗口来获取 s 里面的最小覆盖字串;

  定义两个指针 left 和 right 来指定窗口大小,当right<s.length()+1时,一直执行;

  首先窗口内必须包含 t 内所有字符(就是right一直后移,直到窗口内包含了 t 内的所有字符);

  只有当窗口内包含所有 t 内字符时,left 指针才可以后移,来去掉窗口内不需要的元素;

  然后这样求出最小的覆盖子串,得出结果

    

posted @ 2020-08-01 23:54  Liang-Yi  阅读(89)  评论(0编辑  收藏  举报