原题网址:https://www.lintcode.com/problem/valid-parentheses/description
描述
给定一个字符串所表示的括号序列,包含以下字符: '(', ')'
, '{'
, '}'
, '['
and ']'
, 判定是否是有效的括号序列。
您在真实的面试中是否遇到过这个题?
样例
括号必须依照 "()"
顺序表示, "()[]{}"
是有效的括号,但 "([)]"
则是无效的括号。
标签
栈
思路:利用栈先进后出、后进先出的特点进行匹配。
创建栈,遍历字符串。如果栈为空就把当前字符push到栈中;如果栈不为空就取出栈顶,判断当前字符是否是栈顶括号的另一半,如果是,弹出栈顶。
全部遍历完成后,若栈为空,说明括号是匹配的(有效的),不为空说明括号是不匹配的(无效的)。
注意:若字符串长度是奇数,括号一定是不匹配的。
AC代码:
class Solution {
public:
/**
* @param s: A string
* @return: whether the string is a valid parentheses
*/
bool isValidParentheses(string &s) {
// write your code here
int n=s.size();
if (n<=1||n%2==1)
{
return false;
}
stack<char> tmp;
int j=0;
while(j<n)
{
if (tmp.empty())
{
tmp.push(s[j]);
}
else
{
char temp=tmp.top();
if (rhalf(temp,s[j]))
{
tmp.pop();
}
else
{
tmp.push(s[j]);
}
}
j++;
}
if (tmp.empty())
{
return true;
}
return false;
}
bool rhalf(char c1,char c2)
{
if (c1=='('&&c2==')')
{
return true;
}
if (c1=='['&&c2==']')
{
return true;
}
if (c1=='{'&&c2=='}')
{
return true;
}
return false;
}
};
其他思路:
首先我们需要知道,此题只是让我们判断括号序列是否合法,不是表达式是否合法,因此我们就假定只有括号,或者说我们只考虑括号,不考虑其他的字符。
其次,我们知道括号是否有效:
第一,括号要成对出现,例如出现左圆括号('(')n次,则右圆括号(')')也必须出现n次,对于方括号和花括号也是一样的;
第二,括号可以嵌套,但是从里到外一定是满足可以成对抵消的,而不能够是错开的,这个从样例就可以看出来。
那么我的思路就是借用栈这个数据结构来解此题。
1. 遇到左括号,全部压入栈中;
2. 遇到右括号,判断栈顶的元素是否是相对应的左括号,若是则弹出栈顶元素,若不是则返回false,若栈不为空,也返回false; 转自此博客
其次,我们知道括号是否有效:
第一,括号要成对出现,例如出现左圆括号('(')n次,则右圆括号(')')也必须出现n次,对于方括号和花括号也是一样的;
第二,括号可以嵌套,但是从里到外一定是满足可以成对抵消的,而不能够是错开的,这个从样例就可以看出来。
那么我的思路就是借用栈这个数据结构来解此题。
1. 遇到左括号,全部压入栈中;
2. 遇到右括号,判断栈顶的元素是否是相对应的左括号,若是则弹出栈顶元素,若不是则返回false,若栈不为空,也返回false; 转自此博客
以上博客最后一句描述有错误,已经红字修改过来。
代码可参考: