0%

最小覆盖子串

最小覆盖字串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。
1
2
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"

思路:采用滑动窗口,通过hash t字符串每个字符的频率,同样在滑动窗口调整时维护s的字符频率hash。关于窗口的调整策略:先调整右边界,直到所有节点都已包含,可以更新最小长度。然后调整左边界,如果移动后依旧包含则更新最小长度。如果不包含调整右边界直至继续包含目标串。按照这个策略调整窗口并更新s的hash。右边界在移动的时候如果能保持hash数量大于t串hash对应数量则表示包含。另外全部包含需要一个额外变量存储length,通过每一次窗口调整更新该变量,如果该变量长度等于t串长度则表示已全包含(更新策略,如果右边界判断hash数量大于t串hash对应数量,则length + t中该字符数量,如果左边界判断hash数量小于t串hash对应数量,则length - 1)。

代码:

1
// 待补充。。。