3297. 统计重新排列后包含另一个字符串的子字符串数目 I
题目描述
给你两个字符串 word1 和 word2 。
如果一个字符串 x 重新排列后,word2 是重排字符串的 前缀 ,那么我们称字符串 x 是 合法的 。
请你返回 word1 中 合法 子字符串 的数目。
示例 1:
输入:word1 = "bcca", word2 = "abc"
输出:1
解释:
唯一合法的子字符串是 "bcca" ,可以重新排列得到 "abcc" ,"abc" 是它的前缀。
示例 2:
输入:word1 = "abcabc", word2 = "abc"
输出:10
解释:
除了长度为 1 和 2 的所有子字符串都是合法的。
示例 3:
输入:word1 = "abcabc", word2 = "aaabc"
输出:0
解释:
1 <= word1.length <= 1051 <= word2.length <= 104word1和word2都只包含小写英文字母。
解法
方法一:滑动窗口
思考
子串重排后能覆盖 \(\textit{word2}\) 的全部字符,即子串是 \(\textit{word2}\) 的超多重集合。枚举子串再比较计数在长串上过慢。覆盖关系对窗口单调:一旦满足,再加右端仍满足,缩左端会找到最短覆盖。
维护 \(need\) 种尚未满足的字符。右端纳入使某字符刚好达标则 \(need\) 减一;\(need=0\) 时尽量右移左端。此时左端左侧每一个起点与当前右端都能覆盖,答案加上左端下标。一次滑窗。
题目实际上是求在 \(\textit{word1}\) 中,有多少个子串包含了 \(\textit{word2}\) 中的所有字符。我们可以使用滑动窗口来处理。
首先,如果 \(\textit{word1}\) 的长度小于 \(\textit{word2}\) 的长度,那么 \(\textit{word1}\) 中不可能包含 \(\textit{word2}\) 的所有字符,直接返回 \(0\)。
接下来,我们用一个哈希表或长度为 \(26\) 的数组 \(\textit{cnt}\) 来统计 \(\textit{word2}\) 中的字符出现的次数。然后,我们用 \(\textit{need}\) 来记录还需要多少个字符才能满足条件,初始化为 \(\textit{cnt}\) 的长度。
接着,我们用一个滑动窗口 \(\textit{win}\) 来记录当前窗口中的字符出现的次数。我们用 \(\textit{ans}\) 来记录满足条件的子串的个数,用 \(\textit{l}\) 来记录窗口的左边界。
遍历 \(\textit{word1}\) 中的每个字符,对于当前字符 \(c\),我们将其加入到 \(\textit{win}\) 中,如果 \(\textit{win}[c]\) 的值等于 \(\textit{cnt}[c]\),那么说明当前窗口中已经包含了 \(\textit{word2}\) 中的所有字符之一,那么 \(\textit{need}\) 减一。如果 \(\textit{need}\) 等于 \(0\),说明当前窗口中包含了 \(\textit{word2}\) 中的所有字符,我们需要缩小窗口的左边界,直到 \(\textit{need}\) 大于 \(0\)。具体地,如果 \(\textit{win}[\textit{word1}[l]]\) 等于 \(\textit{cnt}[\textit{word1}[l]]\),那么说明当前窗口中包含了 \(\textit{word2}\) 中的所有字符之一,那么缩小窗口的左边界之后,就不满足条件了,所以 \(\textit{need}\) 加一,同时 \(\textit{win}[\textit{word1}[l]]\) 减一。然后,我们将 \(\textit{l}\) 加一。此时窗口为 \([l, r]\),那么对于任意 \(0 \leq l' \lt l\),\([l', r]\) 都是满足条件的子串,一共有 \(l\) 个,我们累加到答案中。
遍历完 \(\textit{word1}\) 中的所有字符之后,我们就得到了答案。
时间复杂度 \(O(n + m)\),其中 \(n\) 和 \(m\) 分别是 \(\textit{word1}\) 和 \(\textit{word2}\) 的长度。空间复杂度 \(O(|\Sigma|)\),其中 \(\Sigma\) 是字符集,这里是小写字母集合,所以空间复杂度是常数级别的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |