📅  最后修改于: 2023-12-03 14:55:08.642000             🧑  作者: Mango
有一个无限长的字符串,其中只包含4种字符。现在给定字符串的前N个字符,要求找到其中只包含4种字符的子字符串中最长的一个。
给定字符串的前N个字符为:abcdbbcadbdbcaddcba
其中只包含4种字符:a
, b
, c
, d
。
其中只包含4种字符的子字符串有以下8种:
abc
bcd
cdb
dba
abd
bbc
ada
ddd
其中最长的子字符串为abcdbbcadbdbc
, 包含12个字符。
我们可以使用两层循环,枚举所有的子串,并判断是否只包含4种字符。时间复杂度为$O(N^2)$。
def find_longest_substring(s):
n = len(s)
max_len = 0
for i in range(n):
for j in range(i+1, n+1):
if len(set(s[i:j])) == 4:
max_len = max(max_len, j-i)
return max_len
我们可以使用滑动窗口来进行优化。我们可以维护一个窗口,窗口的右端点不断向右移动,直到窗口中包含了所有的4种字符。然后窗口的左端点不断向右移动,直到窗口中只包含了3种字符。在这个过程中,我们记录下窗口的大小,并更新最大值。时间复杂度为$O(N)$。
def find_longest_substring(s):
n = len(s)
max_len = 0
left, right = 0, 0
char_set = set()
while right < n:
char_set.add(s[right])
while len(char_set) > 4:
char_set.remove(s[left])
left += 1
max_len = max(max_len, right-left+1)
right += 1
return max_len
本题可以用暴力枚举和滑动窗口两种方法来求解,滑动窗口的时间复杂度更优。