数据结构与算法-有效括号序列
题目描述:
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
示例1
输入
"["
返回值
false
示例2
输入
"[]"
返回值
true
解题思路:
用栈这种数据结构
代码实现:
import java.util.Stack;public class IsValidString {private static final char SML_LEFT = '(';private static final char SML_RIGHT = ')';private static final char MID_LEFT = '[';private static final char MID_RIGHT = ']';private static final char BIG_LEFT = '{';private static final char BIG_RIGHT = '}';/**** @param s string字符串* @return bool布尔型*/public static boolean isValid (String s) {// write code hereif (null == s){return false;}int length = s.length();if (length%2==1){return false;}Stack<Character> stk = new Stack<>();for (int i=0; i<length; i++){if (stk.isEmpty()){ //如果栈中为空if (s.charAt(i)==SML_RIGHT || s.charAt(i)==MID_RIGHT || s.charAt(i)==BIG_RIGHT){//在栈中为空的情况下,当前的字符为},],),则不符合,返回falsereturn false;}else if (s.charAt(i)==SML_LEFT || s.charAt(i)==MID_LEFT || s.charAt(i)==BIG_LEFT){//在栈中为空的情况下,当前的字符为{,[,(,则做入栈处理stk.push(s.charAt(i));}else{return false;}}else{//如果栈中不为空if (s.charAt(i)==SML_RIGHT || s.charAt(i)==MID_RIGHT || s.charAt(i)==BIG_RIGHT){//在栈中不为空的情况下,当前的字符为},],),判断栈顶元素与当前字符是否匹对char stkTop = stk.peek();if (s.charAt(i)==SML_RIGHT && stkTop == SML_LEFT){stk.pop();}else if (s.charAt(i)==MID_RIGHT && stkTop == MID_LEFT){stk.pop();}else if (s.charAt(i)==BIG_RIGHT && stkTop == BIG_LEFT){stk.pop();}else{return false;}}else if (s.charAt(i)==SML_LEFT || s.charAt(i)==MID_LEFT || s.charAt(i)==BIG_LEFT){stk.push(s.charAt(i));}else{return false;}}}return stk.isEmpty();}public static void main(String[] args){String s = "[{{]}}()";boolean res = isValid(s);System.out.println(res);}}
