20. 有效的括号
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1、题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
2、代码
Java代码
class Solution {
public boolean isValid(String s) {
int len = s.length();
if(len == 0){//特殊
return true;
}
if(len % 2 == 1){//特殊
return false;
}
Stack<Character> stack = new Stack<>();//用栈较为方便
for(int i = 0; i < len; i++){
char cur = s.charAt(i);
if(cur == '(' || cur == '{' || cur =='['){
stack.push(cur);
}
else{
if(stack.empty()){//遍历到右括号,但是栈中没有左括号,不符合,返回false
return false;
}
char pre = stack.peek();
if(cur == ')' && pre == '(' || cur == '}' && pre == '{' || cur == ']' && pre == '['){
stack.pop();
}
else return false;
// if(cur == ')'){
// if(pre == '('){
// stack.pop();
// continue;
// }
// else return false;
// }
// if(cur == '}'){
// if(pre == '{'){
// stack.pop();
// continue;
// }
// else return false;
// }
// if(cur == ']'){
// if(pre == '['){
// stack.pop();
// continue;
// }
// else return false;
// }
// stack.pop();
}
}
return stack.empty();//遍历完有可能只剩左括号,非空但不满足要求
}
}
C++代码
class Solution {
public:
bool isValid(string s) {
int len = s.size();
if(len == 0){
return true;
}
if(len % 2 != 0){
return false;
}
stack<char> tmp;
for(int i = 0; i < len; i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
tmp.push(s[i]);
}
else{
if(tmp.empty()){
return false;
}
if(s[i] == ')'){
if(tmp.top() != '('){
return false;
}
tmp.pop();
}
else if(s[i] == ']'){
if(tmp.top() != '['){
return false;
}
tmp.pop();
}
else{
if(tmp.top() != '{'){
return false;
}
tmp.pop();
}
}
}
return tmp.empty();
}
};
python代码
class Solution:
def isValid(self, s: str) -> bool:
if len(s) == 0:
return True
if len(s) % 2 != 0:
return False
stack = []
for c in s:
if c in '{[(':
stack.append(c)
else:
if not stack:
return False
top = stack.pop()
if c == '}':
if top != '{':
return False
elif c == ')':
if top != '(':
return False
elif c == ']':
if top != '[':
return False
return stack == []
3、小结
思想很简单,就是栈的使用,但是真正写才知道边界条件和细节蛮多的,需注意。
注意栈的声明:Stack stack = new Stack<>();提前说明栈里存放的元素类型比较好,因为后面会取栈顶元素。还有数组的nums.length和str.length()的区别要注意。