LeetCode-20.有效的括号
这道题目非常简单,字符串中只有括号,没有其他的干扰字符。但就算有干扰字符,这道题也不难。很多人本科课程中应该都做过类似的实验。
这题非常明显应该用栈来解决,栈能够实现后进后出,刚好与括号的匹配原则想吻合。
字符串中括号的匹配原则就是:每当遇到右括号就和离它最近的左括号进行匹配,如果能够配对,说明是正常的,可以把这对括号删掉;不然就说明这个字符串是有问题的。
因此,直接遍历字符串中的所有字符,如果是左括号中的一种,则入栈;如果是右括号,则进行匹配。匹配原则是:先检查栈的长度,如果栈为空,说明是一个单独的右括号,错误;栈非空,则进行匹配;匹配成功,左括号应出栈,匹配不成功,返回错误。
最后,应当注意再次检查栈的长度,因为可能会出现只有一个单独的左括号的情况。
这道题并不难,只是考察最基本的数据结构的应用。只需要把边界情况考虑清楚就能够AC。
class Solution {
public:
bool isValid(string s) {
//bool flag=true;
vector<char> temp;
for(int i=0; i<s.length(); i++){
// 如果是左括号则入栈
if(s[i]=='('||s[i]=='['||s[i]=='{'){
temp.push_back(s[i]);
}
else{
// 如果是右括号,先看栈是不是空
if(temp.size()==0){
return false;
}
else{
if(s[i]==')'&&temp.back()=='('){
temp.pop_back();
}
else if(s[i]==']'&&temp.back()=='['){
temp.pop_back();
}
else if(s[i]=='}'&&temp.back()=='{'){
temp.pop_back();
}
else{
// 匹配不成功 则直接返回false
return false;
}
}
}
}
if(temp.size()!=0) return false;
else return true;
}
};