###### tags: `Leetcode` `easy` `stack` `python` `c++` `Top 100 Liked Questions`
# 20. Valid Parentheses
## [題目來源:] https://leetcode.com/problems/valid-parentheses/
## 題目:
Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
An input string is valid if:
1. Open brackets must be closed by the same type of brackets.
1. Open brackets must be closed in the correct order.
1. Every close bracket has a corresponding open bracket of the same type.
## 解題想法:
只存左刮號於stack
使用dict存pair種類 key為右括號、val為左刮號
## Python:
``` python=
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
stack=[s[0]] #只存open
openDic=set(['(','[','{'])
#key: close value:open
pair={')':'(', ']':'[', '}':'{'}
for char in s[1:]:
if char in openDic: #serach O(1)
stack.append(char)
else:
if not stack: #沒左刮
return False
last=stack.pop()
if pair[char]==last: #合法配對
continue
else:
return False
return True if not stack else False #左刮太多False
result=Solution()
ans=result.isValid(s = "()[]{}")
print(ans)
```
## C++:
可以使用 #include <bits/stdc++.h> 一行打天下
``` cpp=
#include <iostream>
#include <stack>
#include <unordered_map>
using namespace std;
class Solution
{
public:
bool isValid(string s)
{
unordered_map<char, char> pair;
pair = {
{')', '('},
{']', '['},
{'}', '{'},
};
stack<char> myStack;
myStack.push(s[0]);
for (int i = 1; i < s.size(); i++)
{
if (pair.find(s[i]) == pair.end())
myStack.push(s[i]);
else
{
if (myStack.empty())
return false;
char val = myStack.top();
myStack.pop();
if (pair[s[i]] == val)
continue;
else
return false;
}
}
if (myStack.empty())
return true;
else
return false;
}
};
int main()
{
Solution res;
string s = "()[]{}";
bool ans = res.isValid(s);
cout << ans << endl;
return 0;
}
```