有効なかっこ(Java実装)

1778 ワード

leetcodeで簡単な有効な括弧問題を引いて、大二学のデータ構造を思い出しました.当時はC言語を使っていたので、Javaで解いたほうがいいと思いますが、最も重要なのはアルゴリズム思想hhh~~問題です.有効な文字列は次のとおりです.
  • 左かっこは、同じタイプの右かっこで閉じる必要があります.
  • 左かっこは正しい順序で閉じなければなりません.注意空の文字列は有効な文字列とみなされます.例1:
  • 入力:()出力:true
    例2:
    入力:「()[]{}」出力:true
    例3:
    入力:[(]]出力:false
    例4:
    入力:「([)]出力:false
    例5:
    入力:{[]}出力:true
    出典:力ボタン(LeetCode)
    class Solution {
    
      // Hash table that takes care of the mappings.
      private HashMap mappings;
    
      // Initialize hash map with mappings. This simply makes the code easier to read.
      public Solution() {
        this.mappings = new HashMap();
        this.mappings.put(')', '(');
        this.mappings.put('}', '{');
        this.mappings.put(']', '[');
      }
    
      public boolean isValid(String s) {
    
        // Initialize a stack to be used in the algorithm.
        Stack stack = new Stack();
    
        for (int i = 0; i < s.length(); i++) {
          char c = s.charAt(i);
    
          // If the current character is a closing bracket.
          if (this.mappings.containsKey(c)) {
    
            // Get the top element of the stack. If the stack is empty, set a dummy value of '#'
            char topElement = stack.empty() ? '#' : stack.pop();
    
            // If the mapping for this bracket doesn't match the stack's top element, return false.
            if (topElement != this.mappings.get(c)) {
              return false;
            }
          } else {
            // If it was an opening bracket, push to the stack.
            stack.push(c);
          }
        }
    
        // If the stack still contains elements, then it is an invalid expression.
        return stack.isEmpty();
      }
    }