📅  最后修改于: 2023-12-03 15:25:02.569000             🧑  作者: Mango
给定一个字符串S和若干个字谜,找到字谜中的一个字符串,使得该字符串既是S的子串,也是所有其他字谜的子串,并且其字典序最小或最大。
我们可以将每个字谜插入到S中,并进行排序。由于插入操作会在S中插入一个新的字符,因此我们只需要找到对于每个字谜,其插入到S中的位置即可。具体地,我们可以使用二分查找来确定插入位置。
对于字典序最小的情况,我们将所有字谜按照其插入到S中的位置排序,从而得到字谜的字典序最小的一个。对于字典序最大的情况,我们反转S和所有字谜,再进行类似的排序和插入操作,最后将得到的解反转即可。
以下是用Python实现的算法:
def min_max_puzzle(S, puzzles):
ans = []
for p in puzzles:
p = ''.join(sorted(p))
l = 0
r = len(S)
while l < r:
mid = (l + r) // 2
if p <= S[mid:mid + len(p)]:
r = mid
else:
l = mid + 1
if S[l:l + len(p)] == p:
ans.append(S[:l] + p + S[l + len(p):])
else:
ans.append("")
return ans
算法的时间复杂度为$O(nk\log k)$,其中$n$为字谜的数量,$k$为S和每个字谜的长度。这是由二分查找和字符串排序造成的。