下面的一段python代码是检查括号匹配问题。
zip(brackets[::2], brackets[1::2])返回的是 (('(', ')'), ('[', ']'), ('{','}'))
代码使用两个字典,count_left和right_for_left。
初始的时候 count_left = {'(' : 0 , '[' : 0, '{' : 0} --- key是左边的括号,value是括号出现的次数
right_for_left = {')':'(', ']':'[', '}':'{'} --- key是右边的括号,value是对应的左边的括号
接下来对text进行遍历,如果当前字符在count_left的key(if c in count_left 相当于 if c in count_left.keys())中,则对应的括号次数加一; 如果当前字符在right_for_left的key中,而此时当前字符对应的做括号在count_left中出现的次数为0,即没有出现左括号,但是出现了右括号,则直接返回False,表明括号不匹配,否则将对应的左括号在count_left中出现的次数减一,表示一次匹配。
最后判断count_left里面是不是所有的value为0,如果均为0,则返回True,否则返回False
def is_banlance(text, brackets = "()[]{}"):
count_left = {}
right_for_left = {}
for left, right in zip(brackets[::2], brackets[1::2]):
count_left[left] = 0
right_for_left[right] = left
for c in text:
if c in count_left:
count_left[c] += 1
elif c in right_for_left:
if count_left[right_for_left[c]] == 0:
return False
else:
count_left[right_for_left[c]] -=1
return not any(count_left.values())
print(is_banlance("()xxx((xxx)){yy}[[]]"))