Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
An input string is valid if:
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Example 1:
Input: "()" Output: true
Example 2:
Input: "()[]{}" Output: true
Example 3:
Input: "(]" Output: false
Example 4:
Input: "([)]" Output: false
Example 5:
Input: "{[]}"
Output: true
大意是:给出一个括号字符串,判断是不是合法的
没什么思路,然后看了讨论里大佬的代码,真的很厉害,
思路:每一看到一个左括号就入栈一个匹配的右括号,如果来的不是左括号,那有有两种可能:
情况一:来的是右括号,如果是合法的,必须要跟stack栈顶的符号一致;那栈其实也是有两种情况:
栈情况一:栈为空——》不合法
栈情况二:栈不为空,那么就要判断栈顶字符和来的字符作判断,一致———》合法,不一致——》不合法
情况二:来的是空,
栈情况一:栈为空,——》合法;
栈情况二:栈为空,——》不合法
知识点:
1.
public char[] toCharArray()将String字符串转化为char型的字符数组
2.for循环,对数组遍历
for(char c:str.toCharArray()){}
3.在如果非空,而且栈顶字符等于来的字符时候,那应该是:只需要弹出栈顶,然后继续做后续判断,不需要返回值的
所以这一个操作可以在判断语句就做好,不用进入到判断条件里面
代码
class Solution { public boolean isValid(String s) { Stack stack = new Stack<Character>(); for(Character c:s.toCharArray()){//这里很重要,之前是定义为char类型,但是因为stack.pop出来的是object类型,结果在判断条件里一致报类型不符合错误 if(c=='(') stack.push(')'); else if(c=='[') stack.push(']'); else if(c=='{') stack.push('}'); else if(stack.isEmpty()){ return false; }else if(!stack.isEmpty()){ if(stack.pop()!=c){ return false; } } } return stack.isEmpty(); } }