给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
- 对于
t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。 - 如果
s中存在这样的子串,我们保证它是唯一的答案。
1 | 输入:s = "ADOBECODEBANC", t = "ABC" |
思路:采用滑动窗口,通过hash t字符串每个字符的频率,同样在滑动窗口调整时维护s的字符频率hash。关于窗口的调整策略:先调整右边界,直到所有节点都已包含,可以更新最小长度。然后调整左边界,如果移动后依旧包含则更新最小长度。如果不包含调整右边界直至继续包含目标串。按照这个策略调整窗口并更新s的hash。右边界在移动的时候如果能保持hash数量大于t串hash对应数量则表示包含。另外全部包含需要一个额外变量存储length,通过每一次窗口调整更新该变量,如果该变量长度等于t串长度则表示已全包含(更新策略,如果右边界判断hash数量大于t串hash对应数量,则length + t中该字符数量,如果左边界判断hash数量小于t串hash对应数量,则length - 1)。
代码:
1 | // 待补充。。。 |