題目:有效的括號
給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認為是有效字符串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
/**
* @author cosefy
* @date 2020/6/8
*/
public class ValidParenthesis {
public static void main(String[] args) {
String s = "";
System.out.println(s);
boolean b = isValid_Test1(s);
boolean b = isValid_Test2(s);
System.out.println("結果是: " + b);
}
//解法一:采用棧的輔助
/*
思路:循環遍歷字符串,遇到左括號就壓棧,否則就出棧,出棧時判斷棧是否為空,遍歷結束后,記得判斷棧空。
分析:一趟遍歷,時間復雜度為O(n)
易錯點:注意棧空的判斷
思考:
-執行用時很少,但內存消耗有點多,考慮是否有辦法節約內存。
-可以判斷字符串的長度是否為0或者為奇數,直接返回結果
*/
public static boolean isValid_Test1(String s) {
if (s.length() == 0)
return true;
if (s.length() % 2 != 0)
return false;
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
} else {
if (stack.isEmpty())
return false;
char cc = stack.pop();
if ((cc == '(' && c != ')') || (cc == '{' && c != '}') || (cc == '[' && c != ']'))
//上述判斷語句也可用HashMap存儲三對括號來查詢實現。
return false;
}
}
return stack.isEmpty();
}
//解法二:數組輔助實現
/*
思路:開辟一個數組存放字符,利用一個變量來訪問數組,若遍歷到左括號,變量自加1,否則變量自減1,
分析:此方法相對來說用時更少。
*/
public static boolean isValid_Test2(String s) {
if (s.length() == 0)
return true;
if (s.length() % 2 != 0)
return false;
char[] chars = new char[s.length()];
int index = -1;
for (char c : s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
index++;
chars[index]=c;
}else {
if(index==-1)
return false;
if(c==')'&&chars[index]=='('||
c=='}'&&chars[index]=='{'||
c==']'&&chars[index]=='[')
index--;
}
}
return index==-1;
}
}