📌  相关文章
📜  重新排列字符串,使得没有一对相邻字符属于同一类型(1)

📅  最后修改于: 2023-12-03 15:12:30.648000             🧑  作者: Mango

重新排列字符串,使得没有一对相邻字符属于同一类型

这个问题可以用贪心算法来解决。我们可以先统计出每种字符出现的次数,然后按照出现次数从高到低排序。接下来我们可以通过交替插入字符来生成新的字符串,每次插入一个字符后,需要重新更新字符出现的次数,以便下一次选择出现次数最高的字符。

具体实现可以使用一个计数数组来记录每个字符出现的次数,然后使用最大堆来维护出现次数最大的字符。在插入字符的时候,可以取出堆顶元素作为要插入的字符,如果堆顶元素对应的字符的数量减1后不为0,则将其重新插入最大堆。下面是具体实现的代码:

import heapq
def reorganizeString(s: str) -> str:
    # 统计字符出现次数
    counts = [0] * 26
    for c in s:
        counts[ord(c) - ord('a')] += 1
    
    # 构建最大堆
    queue = []
    for i in range(26):
        if counts[i] > 0:
            heapq.heappush(queue, (-counts[i], chr(i + ord('a'))))
    
    # 生成新的字符串
    res = []
    while len(queue) > 1:
        # 取出出现次数最多的两个字符
        freq1, c1 = heapq.heappop(queue)
        freq2, c2 = heapq.heappop(queue)
        # 添加到结果中
        res.extend([c1, c2])
        # 更新字符出现次数并重新入堆
        freq1 += 1
        freq2 += 1
        if freq1:
            heapq.heappush(queue, (freq1, c1))
        if freq2:
            heapq.heappush(queue, (freq2, c2))
    
    # 处理剩余的字符
    if queue:
        freq, c = heapq.heappop(queue)
        if -freq > len(res)//2:
            return ""
        res += [c]
    
    return "".join(res)

这个算法的时间复杂度为$O(n\log n)$,其中$n$是字符串的长度。