給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()[]{}"
輸出: true
示例 2:
輸入: "([)]"
輸出: false
示例 3:
輸入: "{[]}"
輸出: true
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
class Solution {
public boolean isValid(String s) {
//最近相關性---》棧
//生活中洋蔥,從中心向外,打開時從外向內;從外向內或從內向外,最外層和最外層是一對,最內層和最內層是一對
//先來後到,隊列
if (s.length() == 0) return true;
// return isValidI(s);
// return isValidII(s);
return isValidIII(s);
}
//方法三:使用棧
//如果是左括號,則將右括號壓棧
//判斷元素是否與棧頂元素匹配,匹配不成功或棧爲空,則不合法
private boolean isValidIII(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(') stack.push(')');
else if (c == '[') stack.push(']');
else if (c == '{') stack.push('}');
else if (stack.isEmpty() || c != stack.pop()) return false;
}
return stack.isEmpty();
}
//方法二:棧
//如果是左括號,壓棧,如果是右括號,就和棧頂元素進行匹配
//匹配成功,棧頂元素移除棧,否則不合法,直到棧爲空
private boolean isValidII(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(' || c == '[' || c == '}') {
stack.push(c);
} else if (stack.isEmpty()) return false;
else if (c == ')' && stack.pop() != '(') return false;
else if (c == ']' && stack.pop() != ']') return false;
else if (c == '}' && stack.pop() != '}') return false;
}
return stack.isEmpty();
}
//方法一:暴力求解,時間複雜度O(n^2)
//不斷replace匹配的括號
//找到左右匹配的括號,替換成空字符串,直到整個String被換成一個空string
//()[]{}直接替換
//((({[]})))-->((({})))-->((()))-->(())-->()-->空
private boolean isValidI(String s) {
char[] c = s.toCharArray();
//長度爲奇數,肯定不是
if (c.length % 2 != 0) return false;
//不斷的replace匹配的括號爲空字符串
for (int i = 0; i < c.length / 2; i++) {
s = s.replaceAll("\\(\\)", "")
.replaceAll("\\[\\]", "")
.replaceAll("\\{\\}", "");
}
return s.isEmpty();
}
}