分析
如何判断括号使用正确?
以 {[()][]} 为例,我们从内向外分析。
() 是成对使用的,我们取出后为 {[][]} ,然后依次为 {[]} 、 {} ,可以判断是有效的括号,即括号使用正确。
代码
左括号进栈,右括号判断是否与栈顶元素成对使用。
bool isValid(string s)
{
if (s.size() % 2 != 0)
return false;
map<char, int> m{{'(', 0}, {'[', 1}, {'{', 2}, {')', 3}, {']', 4}, {'}', 5}};
stack<char> st;
int flag = 0;
for (char c : s)
{
flag = m[c];
if (flag >= 0 && flag <= 2) //左括号进栈
st.push(c);
else if (!st.empty() && flag - m[st.top()] == 3) //判断是否与栈顶元素是成对括号
st.pop(); //删除一对括号
else
return false;
}
//避免容器内剩下2n个左括号
if (!st.empty())
return false;
return true;
}
测试用例
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true