Q: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
public class ValidParentheses {
public boolean isValid(String s) {
Stack<Character> st = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (isLeft(s.charAt(i))){
st.push(s.charAt(i));
}else{
if (st.empty() || !isClose(st.peek(),s.charAt(i))){
return false;
}else{
st.pop();
}
}
}
return st.empty();
}
boolean isLeft(char c){
if (c == '(' || c == '[' || c == '{'){
return true;
}else{
return false;
}
}
boolean isClose(char a, char b){
if(a == '(' && b == ')'){
return true;
}else if(a == '[' && b == ']'){
return true;
}else if(a == '{' && b == '}'){
return true;
}
return false;
}
public static void main(String args[]){
ValidParentheses a = new ValidParentheses();
String s = "{()}";
String s1 = "()[]{}";
System.out.println(a.isValid(s));
System.out.println(a.isValid(s1));
}
}
stack: First-in Last-out
写两个辅助函数,判断是不是左边的括号,是不是isClose()的。
logic:
1.如果属于左边的括号->push 到stack里面
2.如果不属于左边的括号->检查st.peek()和s.chatAt(i)是不是isClose()的。如果是的话st.pop()。
有两种情况需要return false:
1.s.chatAt(i)是右边括号 & stack为空
2.isClose()为false.(isCloase(st.peek(),s.chatAt(i))