字符串解析

今天面试遇到一个字符串解析的题,居然没想到用栈,这里记录一下。

题目

解析字符串,字符串由一位数字、小写字母、括号组成,不会出现连续两个数字,如果是数字n,将数字后的单个字符或括号内的内容重复n次。
例如:
1(1a2b1(ab)1c)->abbabc
ab2(4ab)->abaaaabaaaab
a2(2a4c3(d))f->aaaccccdddaaccccdddf

思路

  • 如果没有括号,可以简单地进行解析,数字的话将其后的字符重复若干次;字符直接返回。
  • 为应对括号的匹配问题,可以使用栈,将字符依次压栈,如果是")",则将"("到")"之间的内容出栈,利用上面提到的解析方式解析,再将结果压栈。

代码

class Stack(object):
    def __init__(self):
        self.data = []

    def push(self, val):
        self.data.append(val)

    def pop(self):
        return self.data.pop(-1)


def isdigit(char):
    if ord(char) >= ord('0') and ord(char) <= ord('9'):
        return True
    else:
        return False


def ischar(char):
    if ord(char) >= ord('a') and ord(char) <= ord('z'):
        return True
    else:
        return False


def parse_no_bracket(string_list):
    if len(string_list) == 0:
        return ''
    if isdigit(string_list[0]):
        num = int(string_list[0])
        return num * string_list[1] + parse_no_bracket(string_list[2:])
    else:
        return string_list[0] + parse_no_bracket(string_list[1:])


def parse(string):
    stack = Stack()
    for i in range(len(string)):
        stack.push(string[i])
        if string[i] == ')':
            things_to_parse = []
            ch = stack.pop()  # )
            while True:
                ch = stack.pop()
                if ch == '(':
                    break
                things_to_parse.append(ch)
            stack.push(parse_no_bracket(list(reversed(things_to_parse))))
    return parse_no_bracket(stack.data)


if __name__ == '__main__':
    string = input().strip()
    print(parse(string))
 

cppowboy
20 声望1 粉丝