题目
(1)给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
(2)有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
(3)示例如下
输入:s = “()[]{}”
输出:true
解决思路
- 用栈记录括号,当遇到左括号时就入栈,当遇到右括号时就出栈。
- 判断栈顶元素是否为与当前右括号相匹配的左括号,如果匹配,则弹出栈,如果不匹配,则说明不是有效的括号序列。则返回false。
- 最后栈为空,说明所有括号都匹配上了,则是有效的括号序列,返回true。
代码
- C++代码
# include <stdio.h>
# include <string>
# include <stack>
using namespace std;
class Solution {
public:
bool isValid(string s) {
stack<char> bracket; // 用栈存储s中的元素
for (int i = 0; i < s.size(); i++) {
switch (s[i]) {
case '(': // 遇到左括号,将括号入栈
case '[':
case '{':
bracket.push(s[i]);
break;
case ')': // 遇到右括号,判断栈顶元素是否与该右括号配对
if (bracket.empty() || bracket.top() != '(') {
return false;
}
bracket.pop();
break;
case ']':
if (bracket.empty() || bracket.top() != '[') {
return false;
}
bracket.pop();
break;
case '}':
if (bracket.empty() || bracket.top() != '{') {
return false;
}
bracket.pop();
break;
default:
break;
}
}
// 最后栈为空,说明所有括号全部匹配,才是有效的括号
return bracket.empty();
}
};
int main() {
Solution *solution = new Solution();
string s = "()[]{}";
printf("%d\n", solution->isValid(s));
return 0;
}
- Python代码
# -*- coding: utf-8 -*-
from typing import List
class Solution:
def __init__(self):
pass
def isValie(self, s: str) -> bool:
bracket: List[str] = [] # 用List模拟栈存储s中的元素
for i in s:
# 遇到左括号,将括号入栈
if '(' == i or '[' == i or '{' == i:
bracket.append(i)
elif ')' == i: # 遇到右括号,判断栈顶元素是否与该右括号配对
if 0 == len(bracket) or bracket[-1] != '(':
return False
bracket.pop()
elif ']' == i:
if 0 == len(bracket) or bracket[-1] != '[':
return False
bracket.pop()
elif '}' == i:
if 0 == len(bracket) or bracket[-1] != '{':
return False
bracket.pop()
# 最后栈为空,说明所有括号全部匹配,才是有效的括号
return 0 == len(bracket)
def main():
solution = Solution()
s: str = "()[]{}"
print(solution.isValie(s))
if __name__ == "__main__":
main()
说明
- 对应LeetCode第20题。
- 链接:https://leetcode-cn.com/problems/valid-parentheses/