赞
踩
栈和队列篇,继续。
记录 二十九【20. 有效的括号】
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
题目意思是看括号有没有成功配对,并且配对顺序由内层到外层合理。
(1)首先,如果string长度是奇数,肯定是false。
(2)双指针法试试:行不通。
示例一:s = " {,[,(,),],} ",从两端指或者从一半的地方指;
对于示例二:s = "()[]{}",不成立,所以pass。
(3)只能从头遍历string s.
class Solution { public: bool isValid(string s) { if(s.size()%2 != 0){ //奇数,肯定不配对。 return false; } stack<char> stack1; for(int i = 0;i < s.size();i++){ if(s[i] == '(' || s[i] == '[' || s[i] == '{'){ stack1.push(s[i]); }else if(s[i] == ')'){ if(!stack1.empty() && stack1.top() == '('){ //补充添加stack1不为空,如果有括号先出现,访问了空栈。 stack1.pop(); }else{ return false; } }else if(s[i] == ']'){ if(!stack1.empty() && stack1.top() == '['){ stack1.pop(); }else{ return false; } }else if(s[i] == '}'){ if(!stack1.empty() && stack1.top() == '{'){ stack1.pop(); }else{ return false; } } } if(stack1.empty()){ //整个for循环结束,成功配对,stack1中不应该有元素。 return true; }else{ return false; } } };
两处细节修正:
class Solution { public: bool isValid(string s) { if(s.size()%2 != 0){ //奇数,肯定不配对。 return false; } stack<char> stack1; for(int i = 0;i < s.size();i++){ if(s[i] == '(') stack1.push(')'); else if(s[i] == '[') stack1.push(']'); else if(s[i] == '{') stack1.push('}'); else if(stack1.empty() || stack1.top() != s[i]){ return false; } else stack1.pop();//注意:这里还得有else } return stack1.empty(); } };
有几处写的很好:
(欢迎指正,转载标明出处)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。