📅  最后修改于: 2023-12-03 14:55:22.029000             🧑  作者: Mango
给定一个字符串,求出一个最小的新字符串,使得原字符串中每个相邻字符在新字符串中仍然相邻。例如,若原字符串为abc
,则可能的新字符串有abc
,acb
,bac
,bca
,cab
和cba
等多种,而其中abc
即为长度最小的符合要求的字符串。
本问题可以使用贪心算法求解。我们可以先统计出每个字符在原串中出现的个数,然后按照字符出现的顺序一次将字符添加到结果串中。对于一个还未加入到结果串中的字符,我们只需要检查这个字符的前驱和后继是否已经在结果串中,如果是,则可以将这个字符加入到结果串的相应位置。
以下为本问题的 Python 实现:
def smallest_adjacent(s):
count = [0] * 26
for c in s:
count[ord(c) - ord('a')] += 1
res = []
for c in s:
count[ord(c) - ord('a')] -= 1
if c in res:
continue
while res and res[-1] > c and count[ord(res[-1]) - ord('a')] > 0:
res.pop()
res.append(c)
return ''.join(res)
本问题是一个经典的贪心问题,通过对每个字符的贪心选择,可以在 $O(n)$ 的时间复杂度内求解出最小的符合要求的字符串。