LeetCode | 20 ValidParentheses

Neking發表於2024-08-10

分析

  • 括號成對出現,鍵值對型別
  • 括號字元序列巢狀出現,不能錯位,順序具有對稱性

為什麼不用陣列這種資料結構來記錄數量?因為這種方法不能保證括號的正確順序。例如,字串'({[)}]'會被認為是有效的。

棧解決有效括號問題

  • 當遇到一個左括號時,我們需要記住它,以便在後續遇到相應的右括號時能夠正確地匹配
  • 當遇到一個右括號時,我們需要檢查最近的一個左括號是否與之匹配

進棧和出棧,相當於完成了一次映象反射。在括號匹配這種具有順序性和對稱性的結構問題上,棧完美符合其要求。

佇列:遵循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("({}{}())"));

    }
}

相關文章