📅  最后修改于: 2023-12-03 14:51:42.163000             🧑  作者: Mango
给定一个字符串 S 和一个整数 k,找到 S 中长度为 k 的最小和最大子串。
最小子串可以通过滑动窗口算法实现,具体步骤如下:
最大子串可以通过构造字符串数组实现,具体步骤如下:
def min_substring(S: str, k: int) -> str:
left = 0
right = k - 1
cnt = {}
min_substring = S + "1" # 设置初始最小子串为 S 加上一个大于 S 的字符
# 初始化 cnt
for i in range(left, right + 1):
c = S[i]
cnt[c] = cnt.get(c, 0) + 1
while right < len(S):
# 检查当前滑动窗口中是否包含所有 k 个字符
if len(cnt) == k:
# 更新最小子串
if S[left : right + 1] < min_substring:
min_substring = S[left : right + 1]
# 移动左指针,并更新 cnt
c = S[left]
cnt[c] -= 1
if cnt[c] == 0:
del cnt[c]
left += 1
else:
# 移动右指针,并更新 cnt
right += 1
if right < len(S):
c = S[right]
cnt[c] = cnt.get(c, 0) + 1
return min_substring if min_substring != S + "1" else ""
def max_substring(S: str, k: int) -> str:
# 构造字符串数组 str
str = []
for i in range(0, 26 ** k):
s = ""
n = i
for j in range(k):
c = chr(ord('a') + n % 26)
s += c
n //= 26
str.append(s)
sub = []
for i in range(len(S) - k + 1):
sub.append(S[i:i+k])
# 对 sub 和 str 排序
sub.sort()
str.sort()
for s in sub:
if s in str:
return s
return ""
最小子串使用滑动窗口算法,时间复杂度为 O(n);最大子串使用字符串数组构造,时间复杂度为 O(26^k)(即最大字符串数组长度)。