1.题目描述
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
根据题目描述,我们可以括号的匹配是后面的括号先匹配,因此我们使用栈存放左括号,然后判断下一个字符与栈中元素是否匹配。
- 从字符串s的第一个字符开始遍历
- 定义栈st, st 为空时,说明没有左括号,只有右括号(eg:)]}),不符合,返回False
- 如果遍历的字符为左括号,则压入栈st中
- 比较 当前字符 和 栈中的字符(st.pop()),不相等,则返回 False
- 以上循环用来判断不符合条件的括号
- 之后如果 st == [] 则 返回True,否则 返回 False。注意:这里排除 [(, 左括号多的字符串。
2. 编程实现
class Solution:
def isValid(self, s: str) -> bool:
parens = "()[]{}" # 字符串中含有的所有 括号类型
open_parens = "([{" # 开括号
opposite = {")": "(", "]": "[", "}": "{"} # 闭括号对应的开括号
st = [] # 使用列表模拟栈, (左)开括号入栈
for pr in s:
if pr not in parens:
return False # 字符串中含有除括号外的其它字符则返回 False
elif pr in open_parens: # pr 如果为开括号 则压入栈 st 中
st.append(pr)
elif st == []: # 栈st为空,说明没有 左括号,只有右括号(eg:]),返回 False
return False
elif st.pop() != opposite[pr]: # 右括号 和 左括号不匹配 eg:[[ 返回False
return False
else:
pass
# 检索完之后,如果出现 栈st 还有字符,可能字符串s只有单括号 如[, 返回False
# if len(st) == 0:
# return True
# else:
# return False
return True if st == [] else False
if __name__ == '__main__':
solution = Solution()
res = solution.isValid("(()]}")
print("res: ", res)
注意:这里不符合的字符串都要进行考虑,比如字符串为空,字符串中 左括号多、右括号多等。