第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 指针才可以后移,来去掉窗口内不需要的元素;
然后这样求出最小的覆盖子串,得出结果