LeetCode 20. 有效的括号 | C语言版
LeetCode 20. 有效的括号
题目描述
题目地址:20. 有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
解题思路
思路一:使用栈
在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多
代码实现
C
bool isValid(char * s){
// 如果s的长度为奇数,一定不符合要求
if (strlen(s) % 2 != 0) return false;
//开辟栈空间
char stack[5000];
int stackTop=0;
//s = "()[]{}"
//遍历字符串
for(int i=0;i<strlen(s);i++){
//在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了
if(s[i]=='(') stack[++stackTop]=')';
else if(s[i]=='{') stack[++stackTop]='}';
else if(s[i]=='[') stack[++stackTop]=']';
//若当前字符为右括号,且栈中无元素或该右括号与栈顶元素不符,返回False
else if(stackTop == 0 || stack[stackTop]!=s[i]) return false;
//当前字符与栈顶元素为一对括号(s[i]与stack[stackTop]相等),将栈顶元素出栈
else stack[--stackTop];
}
//若栈中有元素,返回False。若没有元素(stackTop为0),返回True
return !stackTop;
}
C++
class Solution {
public:
bool isValid(string s) {
// 如果s的长度为奇数,一定不符合要求
if(s.size()%2!=0) return false;
stack<char> st;
//s = "()[]{}"
//遍历字符串
for(int i=0;i<s.size();i++){
//在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了
if(s[i]=='(') st.push(')');
else if(s[i]=='{') st.push('}');
else if(s[i]=='[') st.push(']');
//若当前字符为右括号,且栈中无元素或该右括号与栈顶元素不符,返回False
else if(st.empty() || st.top()!=s[i]) return false;
//当前字符与栈顶元素为一对括号(s[i]与st.top()相等),将栈顶元素出栈
else st.pop();
}
//若栈中有元素,返回False。若没有元素(top为0),返回True
return st.empty();
}
};
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片