问题描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
来源:力扣(LeetCode)
问题代码:
class Solution:
# 定义check函数
def match(str1, str2):
if str1 == '(' and str2 == ')':
return True
if str1 == '[' and str2 == ']':
return True
if str1 == '{' and str2 == '}':
return True
else:
return False
def isValid(self, s: str) -> bool:
# 题解
slist = list(s)
stack = []
stack.append(slist[0])
for i in range(1, len(slist)):
if len(stack) == 0:
stack.append(slist[i])
continue
str1 = stack[-1]
str2 = slist[i]
token = match(str1, str2)
if token:
stack.pop()
else:
stack.append(slist[i])
if len(stack) == 0:
return True
else:
return False
产生原因与解决方法
在调用match
函数时,即语句token = match(str1, str2)
发生错误,百度错误原因,大多数是括号不匹配或者全角半角的问题,但是这里显然不是以上原因,观察力扣官方题解,类中的方法都是写在给定方法之下的方法,所以将match
函数换位置,问题解决。
完整代码
class Solution:
def isValid(self, s: str) -> bool:
# 定义check函数
def match(str1, str2):
if str1 == '(' and str2 == ')':
return True
if str1 == '[' and str2 == ']':
return True
if str1 == '{' and str2 == '}':
return True
else:
return False
# 题解
slist = list(s)
stack = []
stack.append(slist[0])
for i in range(1, len(slist)):
if len(stack) == 0:
stack.append(slist[i])
continue
str1 = stack[-1]
str2 = slist[i]
token = match(str1, str2)
if token:
stack.pop()
else:
stack.append(slist[i])
if len(stack) == 0:
return True
else:
return False