题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
输入:s = "()" 输出:true
输入:s = "()[]{}" 输出:true
输入:s = "(]" 输出:false
输入:s = "([)]" 输出:false
输入:s = "{[]}" 输出:true
思路描述
有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个【左括号放入栈顶】。
当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。
如果不是相同的类型,或者栈中并没有左括号,那么字符串 ss无效
注意:(( 和 )) 的特殊情况。
代码
package com.pshdhx.Algorithm.easy;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* @author pshdhx
* @date 2022-01-12 15:26
* @Des 有效的括号
*/
/**
* 思路描述:有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个【左括号放入栈顶】。
* 当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。
* 如果不是相同的类型,或者栈中并没有左括号,那么字符串 ss无效
* 注意:(( 和 )) 的特殊情况。
*/
public class Brackets {
Boolean isValid(String s) {
//奇数直接返回
if(s.length() % 2 == 1){
return false;
}
//左括号入栈
//有括号入队列 "{[]}"
Stack<Character> stack = new Stack<>();
if(s.charAt(0) == ')' || s.charAt(0) == ']' ||s.charAt(0) == '}'){
return false;
}
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='('
||s.charAt(i)=='['
||s.charAt(i)=='{'){
stack.push(s.charAt(i));
}else if(stack.size()==0){ //解决 ()))
return false;
}else if(s.charAt(i)==')' && stack.size()>0){
Character left = stack.pop();
if(left != '('){
return false;
}
}else if(s.charAt(i)== ']' && stack.size()>0){
Character left = stack.pop();
if(left != '['){
return false;
}
}else if(s.charAt(i)== '}' && stack.size()>0){
Character left = stack.pop();
if(left != '{'){
return false;
}
}
}
//解决 ((这种
if(stack.size()>0){
return false;
}
return true;
}
public static void main(String[] args) {
Brackets b = new Brackets();
Boolean valid = b.isValid("()))");
System.out.println(valid);
}
}