Reverse Shuffle Merge

  • + 1 comment
    def reverseShuffleMerge(s):
        # Write your code here
        
        stashed_dic = Counter(s)
        # the intial requirments for each char
        required_dic = {c:math.ceil(v/2) for c,v in stashed_dic.items()}
        
        result = []
        
        for c in reversed(s):
            stashed_dic[c] -= 1
            if required_dic[c] <= 0:
                continue
            # deal with the pop    
            while result:
                last_c = result[-1]
                if (c < last_c ) and (stashed_dic[last_c] >= required_dic[last_c] + 1):
                    result.pop()
                    required_dic[last_c] += 1 
                else:
                    break
            result.append(c)
            required_dic[c] -= 1
            
        return  "".join(result)