LeetCode第20题—有效的括号
问题描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思想
初步想法
对于这种括号的匹配,我们可以使用栈来实现,栈是先进后出的,符合题目的要求。
例如:{())}
首先是 { ,发现第一个不是},所以进栈。
然后是( ,发现第一个是{,所以进栈。
然后是),发现第一个是(,可以抵消,所以)出栈。
然后是),发现第一个是},所以进栈。
然后是 },发现第一个是),不匹配进栈。
除此之外
我们在进栈的同时需要判断左括号的顺序是否正确。对于不正确的我们返回false。(因为这道题最后运行时没要求)
但是如果有要求的话,我们判断stack的最后一个元素和要进栈的元素的ASCII码就可以比较顺序了
而且
右括号是不可以进栈的,一旦进栈的话就说明无法匹配。
测试用例
情况一:输入为空 “ ”,判断为有效字符串(空字符串)
情况二:输入为“{([])}”,判断为有效字符串
情况三:输入为“({})”,判断为有效字符
代码
class Solution {
/**
* 有效的括号
* @param s
* @return
*/
public boolean isValid(String s) {
//定义一个“栈”
Stack<Character> stack=new Stack<Character>();
//循环处理
for(int i=0;i<s.length();i++){
if(stack.isEmpty()){
//如果栈为空,并且为右括号,直接返回fasle
if(s.charAt(i)==')'||s.charAt(i)=='}'||s.charAt(i)==']'){
return false;
}
//如果栈为空,是左括号
stack.push((Character)s.charAt(i));
}else{//如果栈不为空
//栈不为空遇到左括号时
if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
// //如果括号顺序不对的话,返回false
// if(s.charAt(i)>stack.lastElement()){
// return false;
// }
stack.push((Character)s.charAt(i));
}else{//栈不为空,遇到右括号时
if((s.charAt(i)=='}' && stack.lastElement()=='{' )||(s.charAt(i)==')' && stack.lastElement()=='(')|| (s.charAt(i)==']' && stack.lastElement()=='[')){
//如果相同的话,出栈
stack.pop();
}else{//栈不为空,遇到右括号,然后不匹配时
//System.out.println(stack.lastElement());
//System.out.println(s.charAt(i));
return false;
}
}
}
}
if(stack.isEmpty()){
return true;
}
return false;
}
}
总结
stack的数据结构用于解决这种括号匹配问题是最好不过了。
然后就是关于{ 和 ( 和 [ 的顺序比较的话,直接比较ASCII码就可以了。
完成。