题目简介:
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
1 | 输入: S = "ADOBECODEBANC", T = "ABC" |
说明:
- 如果 S 中不存这样的子串,则返回空字符串
""
。 - 如果 S 中存在这样的子串,我们保证它是唯一的答案。
思路:
先将T
中的字符存入至哈希表中,然后利用滑动窗口的思想,右端窗口不断往右遍历(即扩大窗口),并将字符压入window
中,若发现当前字符出现在T
中,并且出现次数也相等时(即str_t[s[right]] == window[s[right]]
),将valid++
,说明已经有一个字符已经满足要求了。当valid == str_t.size()
时,说明所有字符均已满足要求,开始尝试缩小窗口。
当所有字符每次满足要求时(valid == str_t.size()
),保存满足要求子串的最小长度及当前的left
(即窗口的开始位置)。然后将left
不断往右移,将字符逐渐移出(即缩小窗口)。若遇到之前满足要求的字符,由于将当前字符移出后,一定不会再满足要求了,所以valid--
,left
结束移动的标志时valid != str_t.size()
。
当right
移动至字符串S
的结尾时,结束遍历。
tips:
- 判断字符是否出现在
T
的哈希表中时,需要使用find()
或其他可行的方法,不能使用str_t[s[right]] > 0
的判定方法,这样会时str_t.size()
扩大。 - 结束遍历后,若
len
为初始值,则不存在这样的子串,返回空,但len
的值需要设的大一点。
代码如下:
1 | class Solution { |