括号匹配
需求:检查括号是否配对
输入:一系列括号字符串
输出:0或者1,0:不匹配,1:匹配
例1
输入:"(()())"
输出:True
例2
输入:"(()()"
输出:False
方法1
# 方法1
def match_brackets01(brackets):
"""
思路:
1. 被匹配的字符串数量应该是偶数;
2. 第一个字符必须是"(";
3. 对称位置的括号应该相反,例如:第一个位置是"(",则倒数第一个字符就应该是")",或者"第二个是")",倒数第二个必须是")"
:param brackets: 被匹配的括号字符串
:return: 返回的最终结果
"""
# 默认匹配
flag = 1
# 先判括号长度是否是偶数
if len(brackets) % 2 != 0:
flag = 0
# 检查第一个括号是否是左括号
if brackets[0] != "(":
flag = 0
# 逐个匹配(第一个一定要是左括号"(")
if flag:
for idx, b in enumerate(brackets):
if idx < len(brackets)/2:
idx += 1
if (b == "(" and brackets[len(brackets) - idx] == ")") or (b == ")" and brackets[len(brackets) - idx] == "("):
continue
else:
flag = 0
break
else:
break
return flag
print("01_test", match_brackets01("(()()())"))
print("01_test", match_brackets01("(()()()"))
方法2(用栈实现)
from test03_栈.Stack import Stack
def match_brackets02(brackets):
"""
思路:
1. 被匹配的字符串数量应该是偶数;
2. 第一个字符必须是"(";
3. 遍历字符串:
如果是"(", 直接压栈;
如果是")", 再判断栈是否为空,如果为空表示")"多了, 如果不为空,则出栈;
遍历结束后再判断栈是否为空,如果为空,表示刚好匹配,如果不为空,表示"("多了
:param brackets: 被匹配的字符串
:return: 匹配结果
"""
# 初始化栈对象
s = Stack()
flag = 1
if len(brackets)%2 != 0:
flag = 0
if flag:
if brackets[0] != "(":
flag = 0
if flag:
for b in brackets:
if b == "(":
s.push(b)
else: # b是右括号
if s.is_empty(): # 右括号多了
flag = 0
break
else: # 栈不为空,表示匹配到了
s.pop()
if not s.is_empty(): # 左括号多了
flag = 0
return flag
print("02_test", match_brackets02("(()()())"))
print("02_test", match_brackets02("(()()()"))
方法3(通用括号匹配)
def match_brackets03(brackets):
"""
把方法2中的"("换成"[{(",把")"换成")}]"
:param brackets: 被匹配的字符串
:return: 返回结果
"""
s = Stack()
flag = 1
if len(brackets) % 2 != 0:
flag = 0
if flag:
if brackets[0] not in "[{(":
flag = 0
if flag:
for b in brackets:
if b in "[{(":
s.push(b)
else: # b是右括号
if s.is_empty(): # 右括号多了
flag = 0
break
else: # 栈不为空,表示匹配到了
left_bracket = s.pop()
# 判断左右括号的类型是否一致
if not match_bracket_type(left_bracket, b):
flag = 0
break
if not s.is_empty(): # 左括号多了
flag = 0
return flag
def match_bracket_type(left_bracket, right_bracket):
"""判断左右括号的类型是否一致"""
if "[{(".index(left_bracket) == "]})".index(right_bracket):
return True
else:
return False
print("03_test", match_brackets03("[{()}]"))
print("03_test", match_brackets03("[{(}]"))