Skip to content

Robot String

LeetCode Problem

# https://leetcode.com/problems/using-a-robot-to-print-the-lexicographically-smallest-string/
def robotWithString(s):
    stack = []
    n = len(s)
    # precomputed arr
    precomp_arr = [""] * n

    for i in range(n):  # 3
        precomp_arr[i] = min(s[i:])
    # precom_arr looks like [a,a,c]
    p = ""
    for i in range(n):
        stack.append(s[i])  # b is pushed to stack
        next_min = precomp_arr[i + 1] if i + 1 < len(s) else "z"

        # can we pop b? : is b <= next_min_char(a)
        while stack and stack[-1] <= next_min:
            p += stack.pop()

    # remaining characters
    while stack:
        p += stack.pop()

    return p


def main():
    print(robotWithString(s="bac"))
    print(robotWithString(s="zza"))
    print(robotWithString(s="bdda"))


main()

# this gives TLE since we precomp_arr takes O(N^2) time as i'm calling min() on a substring every time.

# Build precomputed arr efficiently.
precomp_arr[n - 1] = s[n - 1]  # last char (c)
for i in range(n - 2, -1, -1):
    precomp_arr[i] = min(s[i], precomp_arr[i + 1])