The basic idea is I put each element of the string in a stack. Each time I find a closed bracket, I traverse back until I find the corresponding open bracket. I put whatever between these two brackets in a string str and then I keep poping the stack until I find how much times I should repeat the str. I repeat the str and then put it back to the stack. Keep doing this, I will reach the end of my original string, then the join of all the elements in the stack is the answer.
def decodeString(self, s): """ :type s: str :rtype: str """ stack =  str = num = '' for c in s: if c != ']': stack.append(c) else: while stack[-1] != '[': str = stack.pop() + str stack.pop() while stack and stack[-1].isdigit(): num = stack.pop() + num num = int(num) str = str * num stack.append(str) num = str = '' return "".join(stack)