Exemple #1
0
def re_arrange(string):
    li = list(string)
    n = len(li)
    cc = [0 for i in range(26)]

    for i in xrange(len(string)):
        c = string[i]
        idx = ord(c) - ord('a')
        cc[idx] += 1

        if cc[idx] > ceil(n / 2.0):
            print cc[idx]
            return 'Nope'

    pq_size = 0
    for i in range(len(cc)):
        if cc[i] != 0:
            pq_size += 1

    pq = PriorityQueue(pq_size, MAX_PQ)

    for i in xrange(26):
        if cc[i] != 0:
            pq.insert(CharFreq(chr(i + ord('a')), cc[i]))

    res = []
    while not pq.is_empty():
        first = pq.delete_top()
        res.append(first.char)
        first.freq -= 1

        second = None
        if not pq.is_empty():
            second = pq.delete_top()
            res.append(second.char)
            second.freq -= 1

        if first.freq > 0:
            pq.insert(first)

        if second is not None and second.freq > 0:
            pq.insert(second)

    return ''.join(res)
def print_sorted(array):
    k = len(array)
    min_pq = PriorityQueue(k, MIN_PQ)

    for i in range(k):
        min_pq.insert(Element(array[i][0], 0, i))

    while True:
        if min_pq.is_empty():
            break

        element = min_pq.delete_top()

        print element,

        nxt_array = element.array
        nxt_index = element.index + 1

        if nxt_index == len(array[nxt_array]):
            continue

        nxt_el = array[nxt_array][nxt_index]

        min_pq.insert(Element(nxt_el, nxt_index, nxt_array))