《LeetCode之每日一题》:63.有效的括号
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:63.有效的括号相关的知识,希望对你有一定的参考价值。
题目链接: 有效的括号
有关题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 10^4
s 仅由括号 '()[]{}' 组成
题解
法一:栈
代码一:不用哈希表
class Solution {
public:
bool isValid(string s) {
int n = s.length();
if (n % 2 == 1)//减枝
return false;
stack<char> st;
for (char ch : s)
{
if (ch == '(' || ch == '[' || ch == '{')
st.push(ch);
if (ch == ')')
{
if (!st.empty() && st.top() == '(')
st.pop();
else
return false;
}
if (ch == ']')
{
if (!st.empty() && st.top() == '[')
st.pop();
else
return false;
}
if (ch == '}')
{
if (!st.empty() && st.top() == '{')
st.pop();
else
return false;
}
}
if (!st.empty())
return false;
return true;
}
};
代码二:
使用哈希表
class Solution {
public:
bool isValid(string s) {
int n = s.length();
if (n % 2 == 1)
return false;
unordered_map<char,int> m {
{'(',1},
{'[',2},
{'{',3},
{')',4},
{']',5},
{'}',6}
};
stack<char> st;
for (char ch : s)
{
int flag = m[ch];
if (flag >= 1 && flag <= 3)
st.push(ch);
else if (!st.empty() && m[st.top()] == flag - 3)
st.pop();
else
return false;
}
return st.empty();
}
};
代码三:
使用哈希表
哈希表的键为右括号,值为相同类型的左括号
{')', '('},//)为键 (为值
{']', '['},
{'}', '{'}
class Solution {
public:
bool isValid(string s) {
int n = s.length();
if (n % 2 == 1)
return false;
unordered_map<char,char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> stk;
for (char ch : s)
{
if (pairs.count(ch))//找到ch对应的值
{
if (stk.empty() || stk.top() != pairs[ch])//pairs[ch] 为值
return false;
//移除栈顶元素
stk.pop();
}
else
stk.push(ch);//在栈顶增加ch对应值--元素
}
return stk.empty();
}
};
以上是关于《LeetCode之每日一题》:63.有效的括号的主要内容,如果未能解决你的问题,请参考以下文章