字符串解析
今天面试遇到一个字符串解析的题,居然没想到用栈,这里记录一下。
题目
解析字符串,字符串由一位数字、小写字母、括号组成,不会出现连续两个数字,如果是数字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))
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。