尺取法
题意:
给出字符串s和t,求s的最小子串,使得子串的字符集合包含t的字符集合.
这个包含还要考虑同一字符的数量,例如a并不包含aa.
思路:
尺取法套路又来了.
思路是枚举左端点,往右跑最短的长度,使得子串包含t.暴力的话,复杂度O(n2).
尺取法是两个下标i,j.i往右走一格,然后j往右一直走,直到满足条件.然后更新答案,再i往右走一格...
由于i和j最多往右走n格,因此总体时间复杂度是O(n).
至于如何判断是否满足条件,可以先统计字符串t每个字符的个数,然后算法过程中维护尺子的每个字符的个数.
同时要维护尺子里"有效字符"的数量,当它等于t的size时就是满足条件.(当这个字符在t里出现,并且还未够数量时才算有效)
关于尺取法的正确性,假设有两个满足条件的尺子,它们的左右下标分别是L1,R1,L2,R2.
只要L1<L2,那么必有R1<=R2.因此那个j一直往右跑即可,不用回头.
反过来说,只要满足"L1<L2 -> R1<=R2"的性质,就可以直接上尺取法这个套路.
总结:
尺取法,过程中维护尺子有效字符的数量.