📅  最后修改于: 2023-12-03 15:40:15.744000             🧑  作者: Mango
给定两个字符串S和T,求S的前缀长度,满足S中包含T中所有字符。
我们可以用两个指针i和j来扫描S和T,其中i指向S的起始位置,j指向T的起始位置。如果当前S的字符和T的字符相等,那么i和j都往后移动一位。如果当前S的字符和T的字符不相等,只有i往后移动一位。
为了方便起见,我们可以用一个数组freq来记录T中每个字符的出现次数。在扫描S的过程中,对于T中每个字符,如果它在S中出现了,则对应的freq值减一。如果freq值为0,说明该字符在S中出现的次数已经满足要求了,可以忽略。如果freq值大于0,说明该字符在S中还需要出现的次数,此时不能忽略。同时,我们可以用一个变量cnt来记录T中还需要出现的字符数。
如果cnt为0,说明S的前缀已经包含了T中所有的字符,此时我们可以计算出S的前缀长度,并结束算法。否则,我们继续向前扫描S,直到cnt为0为止。
本算法的时间复杂度为O(n),其中n为S的长度。
def min_prefix_length(s: str, t: str) -> int:
freq = [0] * 128
for c in t:
freq[ord(c)] += 1
cnt = len(t)
i, j = 0, 0
while i < len(s) and cnt > 0:
if freq[ord(s[i])] > 0:
cnt -= 1
freq[ord(s[i])] -= 1
i += 1
while cnt == 0:
if freq[ord(s[j])] == 0:
break
freq[ord(s[j])] += 1
j += 1
if cnt == 0:
return i - j
return -1
assert min_prefix_length('ADOBECODEBANC', 'ABC') == 6
assert min_prefix_length('ADOBECODEBANC', '') == 0
assert min_prefix_length('ADOBECODEBANC', 'XYZ') == -1