一、題目大意
標簽: 堆疊和佇列
https://leetcode.cn/problems/valid-parentheses
給定一個只包括 '(',')','{','}','[',']' 的字串 s ,判斷字串是否有效,
有效字串需滿足:
左括號必須用相同型別的右括號閉合,
左括號必須以正確的順序閉合,
示例 1:
輸入:s = "()"
輸出:true
示例 2:
輸入:s = "()[]{}"
輸出:true
示例 3:
輸入:s = "(]"
輸出:false
示例 4:
輸入:s = "([)]"
輸出:false
示例 5:
輸入:s = "{[]}"
輸出:true
提示:
- 1 <= s.length <= 104
- s 僅由括號 '()[]{}' 組成
二、解題思路
思路:括號匹配是典型的使用堆疊來解決的問題,從左向右遍歷,每當遇到左括號便放入堆疊內,遇到右括號則判斷其和堆疊頂的括號是否是統一型別,是則從堆疊內取出左括號,否則說明字符不串不合法,
實作:遍歷字串,如果堆疊為空則將當前字符入堆疊,如果堆疊頂字符與當前字符匹配則堆疊頂字符出堆疊,不匹配當前字符入堆疊,遍歷結束如果堆疊為空說明字串合法,
三、解題方法
3.1 Java實作
public class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (Character c : s.toCharArray()) {
if (isPush(stack, c)) {
stack.push(c);
} else {
stack.pop();
}
}
return stack.isEmpty();
}
private boolean isPush(Stack<Character> stack, Character c) {
if (stack.isEmpty()) {
return true;
}
// {[(
boolean isPop = (stack.peek().equals('[') && c.equals(']') ||
stack.peek().equals('{') && c.equals('}') ||
stack.peek().equals('(') && c.equals(')'));
return !isPop;
}
}
3.2 2014年的實作
public class Solution {
public boolean isValid(String s) {
if (s == null || s.length() == 0) {
return true;
}
Stack<Byte> ps = new Stack<Byte>();
byte[] bArr = s.getBytes();
boolean isValid = true;
for (byte b : bArr) {
if (!isValid) {
break;
}
switch (b) {
case '(':
case '[':
case '{':
ps.push(b);
break;
case ')':
case ']':
case '}':
if (!ps.empty()) {
byte tmpB = ps.pop();
if (tmpB == 40) {
tmpB++;
} else {
tmpB+=2;
}
if (tmpB != b) {
isValid = false;
}
} else {
isValid = false;
}
break;
default:
// do nothing
}
}
if (!ps.empty()) {
isValid = false;
}
return isValid;
}
}
四、總結小記
- 2022/8/9 一場秋雨一場寒
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/501362.html
標籤:其他
下一篇:Lingo求解不等式 函式最大值遇到的問題 | 不等式變數取值錯誤問題 | @bnd()問題 (@bnd();結果與x>1;x<7;結果不一樣?)
