题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
思路:把字符串中左括号的值存进一个栈中,若取到第一个不为左括号的值(即为右括号), 此时可以进行弹栈并进行左右括号的匹配处理,若有一个不符合直接跳出循环(题中的判断主要是为了验证栈空与非空对题目的影响)
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
//1.第一种情况,若为""直接返回true
if(s.equals("")) {
return true;
}
//2.第二种情况,判断左右括号匹配(中间的判断只是为了整体的合理性)
Stack<String> stack1 = new Stack<String>();
boolean flag = false;
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{') {
stack1.push(s.charAt(i)+"");
}else {
//2.1 若取右边括号时,栈为空则证明无左括号
if(!stack1.isEmpty()) {
//取出右括号的值
String temp = s.charAt(i)+"";
//弹出栈中左括号的值
String temp_l = stack1.pop();
//System.out.println(temp_l+":"+temp);
//进行左右括号的匹配
if((temp_l.equals("(") && temp.equals(")")) ||
(temp_l.equals("[") && temp.equals("]")) ||
(temp_l.equals("{") && temp.equals("}"))) {
flag = true;
}else {
//若有一个不符合,直接跳出
flag = false;
break;
}
}else {
flag = false;
}
}
}
//若栈非空,则还有左括号未匹配
if(!stack1.isEmpty()) {
flag = false;
}
return flag;
}
}