给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
思路:
用栈的数据结构,给定一个字符串,首先判断是不是一个空串,如果是空串返回true。进入循环如果这个栈是空的,将字符插入栈中,如果这个栈不是空的,判断这个字符和栈尾的字符是否配套,如果配套则移除栈尾字符并且跳过这次循环
如果这个字符是右括号而且和栈尾字符不配套,返回false,剩余情况(例如插入的是两个‘(’‘【’字符)就是插入这个字符。最后循环完之后,如果栈中是空的则返回true否则返回false。
代码:
class Solution { public boolean isValid(String s) { MyStack myStack = new MyStack(10000); if (s.equals("")) return true; for (int i = 0; i < s.length(); i++) { if (myStack.getnElement() == 0) { myStack.insert(s.charAt(i)); } else if (myStack.getnElement() > 0) { char c1 = s.charAt(i); char c2 = myStack.getEndElement(); if (c1 == ')' && c2 != '(' || c1 == '}' && c2 != '{' || c1 == ']' && c2 != '[') { return false; } else if (c1 == ')' && c2 == '(' || c1 == '}' && c2 == '{' || c1 == ']' && c2 == '[') { myStack.remove(); continue; }else myStack.insert(s.charAt(i)); } } if (myStack.getnElement() == 0) return true; return false; } class MyStack { private char[] chars; private int nElement=0; public MyStack(int i){ chars=new char[i]; } public void insert(char c){ chars[nElement++]=c; } public char remove(){ return chars[--nElement]; } public char getEndElement(){ return chars[nElement-1]; } public int getnElement(){ return nElement; } public char getChar(int i){ return chars[i]; } } }