有效的括号(Python and C++解法)

题目:

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()[]{}"  输出: true

示例2 :

输入: "(]"  输出: false

示例 3:

输入: "([)]"  输出: false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses

思路:

  如果遍历到左括号就入栈;如果遍历到右括号就与栈顶括号比较,如果匹配就返回真,不匹配或者栈为空就返回假。

Python解法:

 1 class Solution(object):
 2     @staticmethod
 3     def is_valid(s: str) -> bool:
 4         if s is None:
 5             return True
 6         stack = []  # 存储左括号
 7         brackets_map = {')':'(', ']':'[', '}':'{'}  # 创建字典(key:value),右括号作为key,用于查找
 8         for c in s:
 9             if c not in brackets_map:
10                 stack.append(c)  # 遇到左括号就需要入栈
11             # 如果遇到右括号后,栈中没有元素,或者当前右括号的value不等于栈顶元素
12             elif stack == [] or brackets_map[c] is not stack.pop():  # 不能使用stack is None,可以使用not stack
13                     return False
14         return not stack  # 如果遍历结束后,栈为空才返回True

C++解法:

 1 #include "pch.h"
 2 #include <iostream>
 3 #include <stack>
 4 #include <string>
 5 #include <unordered_map>
 6 using namespace std;
 7 
 8 class Solution {
 9 public:
10     bool isValid(string s) {
11         if (s.length() == 0)   return true;
12         stack<char> storeRight;  // 存储左括号的栈
13         // 创建字典(key:value),右括号作为key,用于查找
14         unordered_map<char, char> brackets{
15             {')','('},
16             {']','['},
17             {'}','{'} };
18         for (int i = 0; i < s.length(); i++) {
19             if (!(brackets.find(s[i]) != brackets.end())) {  // 遇到左括号
20                 storeRight.push(s[i]);  // 左括号需要入栈
21                 continue;
22             }
23             // 如果遇到右括号后,栈中没有元素,或者当前右括号的value不等于栈顶元素
24             else if (storeRight.empty() || brackets[s[i]] != storeRight.top())
25                 return false;
26             storeRight.pop();  // 匹配成功就弹出
27         }
28         return storeRight.empty();
29     }
30 };
31 
32 int main() {
33     Solution s;
34     string theS = "()[]{}";
35     cout << s.isValid(theS);
36 }
posted @ 2020-05-30 22:17  孔子?孟子?小柱子!  阅读(231)  评论(0编辑  收藏  举报