您的位置:首页 > 编程语言 > C语言/C++

【LeetCode】20 Valid Parentheses (c++实现)

2015-12-17 00:00 260 查看
Given a string containing just the characters
'('
,
')'
,
'{'
,
'}'
,
'['
and
']'
, determine if the input string is valid.

The brackets must close in the correct order,
"()"
and
"()[]{}"
are all valid but
"(]"
and
"([)]"
are not.

题目的意思就是括号是否能正常关闭,也就是说括号要成对出现,并且要保证括号的顺序。看到括号的匹配,第一反应就是算法书中栈的一个应用场景:如果出现了左括号,则将其压进栈中,如果是右括号,则判断栈的top数据是否和该右括号对应,如果是,则出栈。这个题目,因为输入只有左右括号,也就不用去做入参检验了,降低了一点工作量。需要注意的是,最后需要判断栈是否为空,也就是判断是否所有的括号都正常关闭了。代码如下:

class Solution {public:char getPair(char c) {char ret = 0;switch (c) {case ')':
ret = '(';break;case '}':
ret = '{';break;case ']':
ret = '[';break;default:break;
}return ret;
}bool isValid(string s) {
stack<char> st;for (int i = 0; i < (int)s.length(); i++) {char c = s[i];char ret = getPair(c);if (0 == ret) {
st.push(c);
} else {if (st.empty() || st.top() != ret) {return false;
}
st.pop();
}
}return st.empty();
}
};

上面的代码中,getPair方法,是获取右括号匹配的左括号,我这里就是通过switch语句直接输出,当然,也可以用vector或者map等方式,不过这个不是重点。

提交了之后,0ms,还算不错。之后看了discussion中hot question,发现了一些除了stack之外的做法,一个是递归,另一个是动态规划,有兴趣的朋友可以思考一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode 算法 C C++