Reverse Shuffle Merge

  • + 0 comments

    Python 3:

    def reverseShuffleMerge(s):
        """
        Straightforward implementation using only 2 dictionaries:
            - c_reversed - number of symbols left in a reversed part
            - c_shuffled - number of symbols left in a shuffled part
        and fixed the 'result' array to exclude the 'pop' operation.
        """
        c_reversed = {k: v // 2 for k, v in Counter(s).items()}
        c_shuffled = c_reversed.copy()
        result, rlen = [' '] * (len(s) // 2), 0
    
        for char in reversed(s):
            if c_reversed[char]:
                while rlen and result[rlen - 1] > char and c_shuffled[result[rlen - 1]]:
                    rlen -= 1
                    c_reversed[result[rlen]] += 1
                    c_shuffled[result[rlen]] -= 1
                
                c_reversed[char] -= 1
                result[rlen] = char
                rlen += 1
            else:
                c_shuffled[char] -= 1
    
        return ''.join(result)