题目说明
给定一个只包括(,)
,{,}
,[,]
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
测试样例
输入:"()"
输出:true
输入:"()[]{}"
输出:true
输入:"([)]"
输出:false
题意理解
括号匹配,其实是编译原理的一个重要内容,也是符号匹配的基础问题。这类问题,实际上,包括运算式的计算都属于匹配的问题,都可以用栈来解决。
解题方案
使用栈来解决,根据题意可以了解到,两个匹配的括号之间的所有括号都必须匹配,这样的话我们就可以利用栈FILO
的原理,使得最内部的括号最先匹配,一旦有不匹配的项目则返回false
即可。
当然也需要考虑多项的问题。
class Solution {
public:
bool isValid(string s) {
stack<char> st;//栈
for(int i = 0;i<s.size();i++){//扫描一遍
switch(s[i]){//根据不同的符号处理
case ')'://找匹配的过程
if(st.empty()||st.top()!='(')
return false;
else
st.pop();
break;
case ']':
if(st.empty()||st.top()!='[')
return false;
else
st.pop();
break;
case '}':
if(st.empty()||st.top()!='{')
return false;
else
st.pop();
break;
default:
st.push(s[i]);
}
}
if(st.empty())//如果有多余项
return true;
return false;
}
};
所有代码都可以在我的github上找到:LeetCode