【发布时间】:2021-11-06 06:51:12
【问题描述】:
(我故意删除了某人添加的“Python”标签,以保持这个问题与语言无关。)
我想我设法通过展开每个大括号的堆栈来迭代地解决这个问题,这是一个我很满意的解决方案(假设它有效)。但我未能实现单个函数递归。有人可以帮忙吗?我尝试的结果太复杂了,我无法想象,根据逗号和大括号之间的关系,需要不同的附加场景而不是扩展场景。
这样的事情有优雅的递归吗?对于我可以针对此类问题研究的其他类型的已建立解析/语言方法的任何建议,我也将不胜感激。
问题描述:给定一串字母、有效的花括号和逗号;展开大括号,以便结果包括紧邻大括号左侧的字母子字符串的所有可能性,这些字母子字符串与大括号内的每个逗号分隔的字母子字符串连接。大括号可以嵌套。
例子:
"abc{d,e}f{g,hi}" => ['abcdfg', 'abcdfhi', 'abcefg', 'abcefhi']
"abc{d{0,1},e}f{g{0{a,b},1,2},hi}" =>
['abcd0fg0a', 'abcd0fg0b', 'abcd0fg1', 'abcd0fg2', 'abcd0fhi',
'abcd1fg0a', 'abcd1fg0b', 'abcd1fg1', 'abcd1fg2', 'abcd1fhi',
'abcefg0a', 'abcefg0b', 'abcefg1', 'abcefg2', 'abcefhi']
(希望工作)迭代 Python 代码:
# Brace expansion
# Example:
# input "abc{d,e}f{g,hi}"
# output ["abcdfg", "abcdfhi", "abcefg", "abcefhi"]
def f(s):
stack = []
i = 0
while i < len(s):
j = i
while s[j] not in ['{', '}', ',']:
j += 1
if s[i:j]:
stack.append([s[i:j]])
i = j
if s[i] == '{':
stack.append('{')
i += 1
if s[i] == ',':
i += 1
# Unwind stack
if s[i] == '}':
# Get comma, separated elements
lst = []
while stack[-1] != '{':
lst.extend(reversed(stack.pop()))
lst = reversed(lst)
stack.pop() # Remove '{'
pfxs = reversed(stack.pop())
stack.append([pfx + sfx for pfx in pfxs for sfx in lst])
i += 1
# Cartesian product of stack
result = []
for i in range(1, len(stack)):
result = [pfx + sfx for pfx in stack[i-1] for sfx in stack[i]]
return result
输出:
s = "abc{d,e}f{g,hi}"
print(s)
print(f(s))
s = "abc{d{0,1},e}f{g{0{a,b},1,2},hi}"
print("")
print(s)
print(f(s))
"""
abc{d,e}f{g,hi}
['abcdfg', 'abcdfhi', 'abcefg', 'abcefhi']
abc{d{0,1},e}f{g{0{a,b},1,2},hi}
['abcd0fg0a', 'abcd0fg0b', 'abcd0fg1', 'abcd0fg2', 'abcd0fhi',
'abcd1fg0a', 'abcd1fg0b', 'abcd1fg1', 'abcd1fg2', 'abcd1fhi',
'abcefg0a', 'abcefg0b', 'abcefg1', 'abcefg2', 'abcefhi']
"""
【问题讨论】:
标签: algorithm recursion brace-expansion