我是一个Python新手,我遇到了检查给定字符串中的简单括号"(",")"是否均匀匹配的练习.
我在这里看到了使用stack命令的例子,我还没有遇到过.所以我尝试了另一种方法.谁能告诉我哪里出错了?
def matched(str):
ope = []
clo = []
for i in range(0,len(str)):
l = str[i]
if l == "(":
ope = ope + ["("]
else:
if l == ")":
clo = clo + [")"]
else:
return(ope, clo)
if len(ope)==len(clo):
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
想法是将"("和")"堆积到两个单独的列表中,然后比较列表的长度.我还有另一个版本,其中我附加了列表ope和clo与相关的i分别持有(或).
谢谢你的时间!
Hen*_*gan 11
下面是一个非常优雅的方法.它清理for循环并用一个简单的计数器变量替换列表.如果计数器降到零以下,它也会返回false,这样matched(")(")就会返回False.
def matched(str):
count = 0
for i in str:
if i == "(":
count += 1
elif i == ")":
count -= 1
if count < 0:
return False
return count == 0
Run Code Online (Sandbox Code Playgroud)
这将检查括号是否正确匹配,而不仅仅是是否有相同数量的左括号和右括号.我们使用a list作为堆栈并在遇到开括号时将其推到它上,当我们遇到右括号时从它弹出.
您的解决方案的主要问题是它只计算括号的数量但不匹配它们.跟踪当前嵌套深度的一种方法是将开括号推入堆栈并在遇到右括号时从堆栈中弹出它们.
def do_parentheses_match(input_string):
s = []
balanced = True
index = 0
while index < len(input_string) and balanced:
token = input_string[index]
if token == "(":
s.append(token)
elif token == ")":
if len(s) == 0:
balanced = False
else:
s.pop()
index += 1
return balanced and len(s) == 0
Run Code Online (Sandbox Code Playgroud)
我的解决方案适用于括号、圆括号和大括号
openList = ["[","{","("]
closeList = ["]","}",")"]
def balance(myStr):
stack= []
for i in myStr:
if i in openList:
stack.append(i)
elif i in closeList:
pos = closeList.index(i)
if ((len(stack) > 0) and (openList[pos] == stack[len(stack)-1])):
stack.pop()
else:
return "Unbalanced"
if len(stack) == 0:
return "Balanced"
print balance("{[()](){}}")
Run Code Online (Sandbox Code Playgroud)
你做的最明显的错误是:
if l == ")":
clo = clo + [")"]
else:
return(ope, clo) # here
Run Code Online (Sandbox Code Playgroud)
通过使用return,当遇到第一个不等于"("或")"的char时,退出函数.还有一些缩进.
允许代码运行的最小更改(尽管它不能为所有可能的输入字符串提供正确的答案)是:
def matched(str):
ope = []
clo = []
for i in range(0,len(str)):
l = str[i]
if l == "(":
ope = ope + ["("]
elif l == ")":
clo = clo + [")"]
if len(ope)==len(clo):
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)