您的位置:首页 > 其它

Leetcode有效的括号算法与分析

2019-07-12 22:23 91 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Maple_PI/article/details/95594877

@Leetcode有效的括号

相信有效的括号对于大多数的小白coder并不陌生,每个人在学习数据结构的栈的这一章节时都会接触到或者至少了解到这一问题。本题是使用栈结构的一个标志性的题因为栈结构先进后出的特性十分符合括号一层包一层的关系。废话少说,来看题干:

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。注意空字符串可被认为是有效字符串。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。

示例 1:

输入: “()”
输出: true

示例 2:

输入: “()[]{}”
输出: true

示例 3:

输入: “(]”
输出: false

示例 4:

输入: “([)]”
输出: false

示例 5:

输入: “{[]}”
输出: true

本题题意上几乎已经揭示需要使用栈结构,那么我们需要先建立一个栈。括号的栈使用规则是建立在括号的成双配对的,而本题并没有要求括号必须要按照小括号中括号大括号的顺序来,故少了一些判断,仅需在每一个左括号出现时进行push压栈,在每个右括号出现时选取top最顶的元素,判断是否匹配即可。
代码如下:

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


显然本题在细节方面是需要注意的,并且需要一定的栈结构的基础来完成,题中对栈结构的定义有可能出现问题,具体情况如下图,相信不少coder都曾遇到:

这是因为最后的return没有用stack的返回,而系统要求返回值需要与所定义的一致,此处只需要将最终输出的判断改成st.empty()的判断就行。还有一种错误如下图:

当出现这种错误的时候请检查是否有重复的判断条件或者在循环内判断了s.empty(),这些都有可能导致这种错误。

其他的判断与细节无需赘述,就是别忘记一定要把判断过后的单元pop一下啦。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: