LeetCode: Decode String Posted on January 21, 2018July 26, 2020 by braindenny Decode String Given an encoded string, return it’s decoded string. The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer. You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc. Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won't be input like 3a or 2[4]. Examples: s = "3[a]2[bc]", return "aaabcbc". s = "3[a2[c]]", return "accaccacc". s = "2[abc]3[cd]ef", return "abcabccdcdcdef". Github: code.dennyzhang.com Credits To: leetcode.com Leave me comments, if you have better ways to solve. ## https://code.dennyzhang.com/decode-string ## Basic Ideas: Use stack ## number applies to the next string ## Keep pushing until we get a ']', then we pop ## Keep poping until we get a '['. Caculate the result and push again. ## Then check the next element in the input string. ## ## Watch out: 12[a]2[bc] ## ## Complexity: class Solution(object): def decodeString(self, s): """ :type s: str :rtype: str """ stack = [] prev_str = '' for ch in s: if ch == '[': if prev_str != '': stack.append(prev_str) prev_str = '' stack.append(ch) elif ch == ']': element = prev_str prev_str = '' # pop until we get '[' while stack[-1] != '[': v = stack.pop() if v.isdigit(): element = element*int(v) else: element = "%s%s" % (v, element) stack.pop() # remove [ while len(stack)!= 0 and stack[-1].isdigit(): element = element*int(stack.pop()) stack.append(element) elif ch.isalpha(): if prev_str != '' and prev_str.isdigit(): stack.append(prev_str) prev_str = '' prev_str = '%s%s' % (prev_str, ch) else: if prev_str != '' and prev_str.isalpha(): stack.append(prev_str) prev_str = '' prev_str = '%s%s' % (prev_str, ch) # print stack if prev_str != '': stack.append(prev_str) return ''.join(stack) Post Views: 5