#3728. 最小覆盖子串

最小覆盖子串

最小覆盖子串

来自leetcode,是亚马逊、字节跳动和Adobe的招聘题目

题目描述

给你一个字符串 s 和一个字符串 t。请你在字符串 s 中找出涵盖 t 所有字符的最小子串。

  • 对于 t 中重复出现的字符,子串中该字符的数量必须不少于 t 中该字符的数量。
  • 如果 s 中不存在涵盖 t 所有字符的子串,则输出空字符串(即输出一个空行)。
  • 如果存在这样的子串,题目保证答案唯一。

输入格式

第一行一个整数 n,表示字符串 s 的长度。

第二行一个字符串 s。

第三行一个整数 m,表示字符串 t 的长度。

第四行一个字符串 t。

输出格式

输出一行,为 s 中涵盖 t 所有字符的最小子串;不存在时输出空行。

样例输入 #1

13
ADOBECODEBANC
3
ABC

样例输出 #1

BANC

样例输入 #2

1
a
1
a

样例输出 #2

a

样例输入 #3

1
a
2
aa

样例输出 #3


说明

  • 样例 1:最小覆盖子串是 "BANC",它涵盖了 t 中的一个 A、一个 B 和一个 C。
  • 样例 2:整个字符串就是答案 "a"。
  • 样例 3:s 中只有一个 a,无法满足 t 对两个 a 的要求,输出空行。
  • 大小写字母视为不同字符,例如 'A' 与 'a' 不相同。

数据范围

  • 0 <= n, m <= 10^5
  • s 和 t 由英文字母(区分大小写)组成
  • m = 0 时,空字符串即可覆盖,输出空行