题目: 来源于LeetCode
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。
代码:
class Solution {
public:
bool isValid(string s) {
// 本题考察的是栈的用法
stack<char> sta;
for(int i=0; i<s.size(); i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{') sta.push(s[i]);
// 如果和各种括号配对, 就弹出
else if(s[i] == ')'){
if(!sta.empty() && sta.top() == '(') sta.pop();
else return false;
}else if(s[i] == ']'){
if(!sta.empty() && sta.top() == '[') sta.pop();
else return false;
}else if(s[i] == '}'){
if(!sta.empty() && sta.top() == '{') sta.pop();
else return false;
}
}
// 如果还剩括号也不满足要求
if(!sta.empty()) return false;
return true;
}
};
总结:
为了尽可能地提高算法的效率,作者认为应该首先分析题目,总结规律,看利用数据结构的知识能否快速解决问题。本题牵扯到匹配问题,括号的有效性意味着()、{}、【】对应,一个左括号对应右括号应是距离其最近的,当匹配完成后,可以把他们从栈内释放出来。