分析
- 括號成對出現,鍵值對型別
- 括號字元序列巢狀出現,不能錯位,順序具有對稱性
為什麼不用陣列這種資料結構來記錄數量?因為這種方法不能保證括號的正確順序。例如,字串'({[)}]'會被認為是有效的。
棧解決有效括號問題
- 當遇到一個左括號時,我們需要記住它,以便在後續遇到相應的右括號時能夠正確地匹配
- 當遇到一個右括號時,我們需要檢查最近的一個左括號是否與之匹配
進棧和出棧,相當於完成了一次映象反射。在括號匹配這種具有順序性和對稱性的結構問題上,棧完美符合其要求。
佇列:遵循FIFO原則,適用於需要按照元素加入順序處理資料的場景
棧:遵循LIFO原則,適用於需要按照元素加入的逆序處理資料的場景
主類
public class ValidParentheses {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
Map<Character, Character> parenthessesMap = new HashMap<>();
parenthessesMap.put(')', '(');
parenthessesMap.put('}', '{');
parenthessesMap.put(']', '[');
for (char c : s.toCharArray()) {
if (parenthessesMap.containsValue(c)) {
// 如果是左括號,壓入棧
stack.push(c);
} else if (parenthessesMap.containsKey(c)) {
if (stack.isEmpty() || !stack.pop().equals(parenthessesMap.get(c))) {
return false;
}
} else {
return false;
}
}
return stack.isEmpty();
}
}
測試類
public class ValidParenthesesTest {
@Test
public void test_ValidParentheses() {
ValidParentheses validParentheses = new ValidParentheses();
System.out.println(validParentheses.isValid("(())"));
System.out.println(validParentheses.isValid("(()]])"));
System.out.println(validParentheses.isValid("({}{}())"));
}
}