題目描述
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: “()”
輸出: true
示例 2:
輸入: “()[]{}”
輸出: true
示例 3:
輸入: “(]”
輸出: false
示例 4:
輸入: “([)]”
輸出: false
示例 5:
輸入: “{[]}”
輸出: true
思路:把字符串中左括號的值存進一個棧中,若取到第一個不爲左括號的值(即爲右括號), 此時可以進行彈棧並進行左右括號的匹配處理,若有一個不符合直接跳出循環(題中的判斷主要是爲了驗證棧空與非空對題目的影響)
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
//1.第一種情況,若爲""直接返回true
if(s.equals("")) {
return true;
}
//2.第二種情況,判斷左右括號匹配(中間的判斷只是爲了整體的合理性)
Stack<String> stack1 = new Stack<String>();
boolean flag = false;
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{') {
stack1.push(s.charAt(i)+"");
}else {
//2.1 若取右邊括號時,棧爲空則證明無左括號
if(!stack1.isEmpty()) {
//取出右括號的值
String temp = s.charAt(i)+"";
//彈出棧中左括號的值
String temp_l = stack1.pop();
//System.out.println(temp_l+":"+temp);
//進行左右括號的匹配
if((temp_l.equals("(") && temp.equals(")")) ||
(temp_l.equals("[") && temp.equals("]")) ||
(temp_l.equals("{") && temp.equals("}"))) {
flag = true;
}else {
//若有一個不符合,直接跳出
flag = false;
break;
}
}else {
flag = false;
}
}
}
//若棧非空,則還有左括號未匹配
if(!stack1.isEmpty()) {
flag = false;
}
return flag;
}
}