有效的括號
給定一個只包括 '('供鸠,')','{'陨闹,'}'回季,'[',']' 的字符串正林,判斷字符串是否有效泡一。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合觅廓。
注意空字符串可被認(rèn)為是有效字符串鼻忠。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}"
輸出: true
public boolean isValid(String s) {
if (s==null || s.length()==0) return true;
char[] ch = s.toCharArray();
Stack<Character> stack = new Stack();
for(int i=0;i < ch.length;i++) {
if (ch[i]==')' && stack.size()>0 && stack.peek()=='(')
stack.pop();
else if (ch[i]==']' && stack.size()>0 && stack.peek()=='[')
stack.pop();
else if (ch[i]=='}' && stack.size()>0 && stack.peek()=='{')
stack.pop();
else {
stack.push(ch[i]);
}
}
if (stack.size() != 0)
return false;
return true;
}
最長有效括號
給定一個只包含 '(' 和 ')' 的字符串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: "(()"
輸出: 2
解釋: 最長有效括號子串為 "()"
示例 2:
輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串為 "()()"
public int longestValidParentheses(String s) {
if (s==null || s.length()==0) return 0;
char[] ch = s.toCharArray();
Stack<Integer> stack = new Stack();
//先推入-1可以避免當(dāng)棧為空時要減棧頂?shù)膇ndex帖蔓,為空時也可以正常計算
stack.push(-1);
int result = 0;
for(int i=0;i < ch.length;i++) {
//只有當(dāng)')'不是第一個遍歷的(stack.size()>1),并且遍歷到的符號為')'而棧頂是'('時兩個可以配對
if (ch[i] == ')' && stack.size()>1 && ch[stack.peek()] == '(') {
stack.pop();
// (())() 前面兩對result=4矮瘟,后面一對result=2,凡是涉及到最長塑娇,一定是max
result = Math.max(result, i - stack.peek());
}else stack.push(i);
}
return result;
}