📅  最后修改于: 2023-12-03 15:11:20.108000             🧑  作者: Mango
子字符串是指一个字符串中连续的一段字符组成的字符串。
例如:
字符串 "hello world" 中的子字符串有:"h"、"he"、"hel"、"hell"、"hello"、"o"、"or"、"orl"、"orld" 等等。
给定字符串 S 和一个整数 K,找出可以由字符串 S 作为子字符串恰好 K 次组成的最小的字符串。这个字符串可以由 S 粘贴 K 次形成,但是你不能在其中重叠 S 中的字符。
例如,如果 S="aba",K=4,那么解决方案可以是 "abababaa",其中 "ababab" 是由 S 粘贴 3 次形成的,"a" 是必需的后缀,确保该字符串出现 S 恰好 4 次。
要想让给定字符串 S 恰好出现 K 次,我们需要构建一个新的字符串,使得 S 出现的次数为 K 次,且该字符串长度尽可能地短。因为我们不能在其中重叠 S 中的字符,所以该字符串的结尾必须是 S 的一个后缀。因此,我们可以将 S 的所有后缀按照长度升序排序,然后尝试使用它们构建目标字符串,直到目标字符串中 S 出现了 K 次为止。当我们尝试使用一个后缀时,我们需要检查该后缀是否可以用来构造目标字符串,并且需要保证 S 不能与其它 S 的出现重叠。如果所有后缀都无法用来构造目标字符串,那么 S 中不存在一个子字符串可以恰好出现 K 次。
以下是具体步骤:
def build_string(s: str, k: int) -> str:
n = len(s)
suffixes = sorted([s[i:] for i in range(n)])
for suffix in suffixes:
if suffix * k in s:
substrings = [suffix * i for i in range(1, k+1)]
for substring in substrings:
if s.count(substring) != 1:
break
else:
return s + suffix[-1*n//k:]
return ""
该程序的时间复杂度为 O(nlogn),其中 n 是字符串 S 的长度。这是由于我们需要对字符串 S 的所有后缀排序,而排序所需的时间复杂度为 O(nlogn)。在最坏情况下,我们需要尝试使用每个后缀来构造目标字符串,而每次判断需要 O(n) 的时间,因此总时间复杂度为 O(n2)。
该程序的空间复杂度为 O(nlogn),其中 n 是字符串 S 的长度。这是由于我们需要将所有的后缀保存在一个列表中,排序所需的额外空间是 O(nlogn)。