オットセイの経営日誌

データサイエンス系ベンチャーを経営してます。経営のこと、趣味のことつぶやきます。

LeetCode / Valid Parentheses

https://leetcode.com/problems/valid-parentheses/

Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.

Example 1:
Input: "()"
Output: true

Example 2:
Input: "(){}"
Output: true

Example 3:
Input: "(]"
Output: false

Example 4:
Input: "([)]"
Output: false

Example 5:
Input: "{}"
Output: true

Parenthesesというのは括弧という意味らしいです。初めて知った。。。
括弧が正しい順序で閉じられているか判定する問題です。後入れ先出し(一番最後に始まった括弧をまず閉じなければならない)ですね。
小学生の頃、こんがらがった記憶があります。小学校のプログラミング教育 兼 算数教育に使えそう。

回答・解説

解法1

公式の解説はこちら。 listの変数stackにopenする括弧を格納しておき、closeする括弧が現れたら、最後にopenした括弧と対応しているかチェックします。
ほとんどの解法で、対応する括弧をハッシュテーブルに格納しておくのは共通です。

class Solution(object):
    def isValid(self, s):
        stack = []
        mapping = {")": "(", "}": "{", "]": "["}
        for char in s:
            # closeする括弧が現れたら、最後にopenした括弧をstackから取り出しtop_elementとし、closeする括弧との対応をチェック
            if char in mapping.keys():
                # stackが空、つまりopenした括弧の中でcloseされていない括弧がないときにcloseする括弧が現れたら、'#'を格納(この後すぐfalseを返す)
                top_element = stack.pop() if stack else '#'
                if mapping[char] != top_element:
                    return False
            # openする括弧が現れたら、stackに格納
            else:
                stack.append(char)
        return not stack
解法2

対応する括弧をハッシュテーブルに格納するのは同じですが、こちらはopenする括弧をkeyに、closeする括弧をvalueにとります。 計算量はさほど変わりません。

class Solution(object):
    def isValid(self, s):
        mapping = {"(": ")", "[": "]",  "{": "}"}
        open_par = set(["(", "[", "{"])
        stack = []
        for char in s:
            if char not in open_par:
                if stack and char == mapping[stack[-1]]:
                    stack.pop()
                else:
                    return False
            else:
                stack.append(char)
        return not stack