原题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
题目大意
要求:
1.左右括号个数要相等,且逐一匹配。
2.分析错误的类型
(1)左括号为空,"]"
(2)左右括号不匹配,"( [ ) ]"
题目分析
栈的基本操作:
如果遇到左括号则入栈,如果遇到右括号且右括号与栈顶的左括号匹配则出栈,不匹配则错误,或右括号直接入栈的第一个元素,因为没有与之匹配的左括号,所以也错误
用原数组模拟栈:
直接对原数组进行以上操作
好处:节省空间和时间
缺点:改变了原数组的值
完整代码
C
bool isValid(char * s)
{
int i=0,j=0;
for(int i =0; i < s.strlen(); i++){
if(s[i]=='('||s[i]=='['||s[i]=='{')
s[j++]=s[i];
else if(j!=0&&(s[i]==')'&&s[j-1]=='('||s[i]==']'&&s[j-1]=='['||s[i]=='}'&&s[j-1]=='{'))
j--;
else
return false;
}
return j==0;
}
C++
class Solution {
public:
bool isValid(string s) {
stack<char>st;
for(auto c : s){
if(c == '('||c=='{'||c=='['){
st.push(c);
}else if(!st.empty()&&(st.top()=='('&&c==')'||st.top()=='{'&&c=='}'||st.top()=='['&&c==']')){
st.pop();
}else{
return false;
}
}
return st.empty();
}
};
总结
了解栈的相关知识,理解清楚思路