Reverse Shuffle Merge

  • + 0 comments

    O(n) time complexity because even with nested while loop an element of s is only pushed and popped a maximum of 1 times

    from collections import Counter
    
    def reverseShuffleMerge(s):
        char_counts = Counter(s)
        required = Counter()
        for key, value in char_counts.items():
            required[key] = value // 2
        last_char = s[-1]
        char_counts[last_char] -= 1
        required[last_char] -= 1
        result = [last_char]
        for i in range(len(s)-2, -1, -1):
            char = s[i]
            char_counts[char] -= 1
            if not required[char]:
                pass
            elif (not result) or (char >= result[-1]):
                result.append(char)
                required[char] -= 1
            else:
                while result and char < result[-1] and char_counts[result[-1]] >= required[result[-1]] +1:
                    old_char = result.pop(-1)
                    required[old_char] += 1
                result.append(char)
                required[char] -= 1
        return "".join(result)