diff --git a/valid_parentheses/phase1.py b/valid_parentheses/phase1.py new file mode 100644 index 0000000..20899c1 --- /dev/null +++ b/valid_parentheses/phase1.py @@ -0,0 +1,32 @@ +# in-validとなるとき +# ある種類のopen bracketの出現回数が0なのにclosed bracketが出てくる +# closed bracketが出てきた時, open bracketに他の種類のものが紛れ込んでいる +# 全ての作業が終わった後, open bracketの数が0になっていない + +# ↑...という回答を真っ先に思い浮かんだが, 何か考えすぎているきがした。 +# 明らかにおかしいのでもう少し問題の性質をちゃんと考えてみることに +# dequeを使って最後に見たopen bracketを管理するFIFOにすればいいことに気付き, 採用 + +from collections import deque + +class Solution: + def isValid(self, s: str) -> bool: + last_seen_open_brackets = deque([]) + last_seen_open_bracket = "" + open_brackets = set(["(", "[", "{"]) + close_bracket_to_open_bracket = {")":"(", "}":"{", "]":"["} + for char in s: + if char in open_brackets: + last_seen_open_brackets.appendleft(last_seen_open_bracket) + last_seen_open_bracket = char + + elif char in close_bracket_to_open_bracket: + if last_seen_open_bracket != close_bracket_to_open_bracket[char]: + return False + if len(last_seen_open_brackets) != 0: + last_seen_open_bracket = last_seen_open_brackets.popleft() + + if len(last_seen_open_brackets) != 0: + return False + + return True \ No newline at end of file diff --git a/valid_parentheses/phase2.py b/valid_parentheses/phase2.py new file mode 100644 index 0000000..beb0193 --- /dev/null +++ b/valid_parentheses/phase2.py @@ -0,0 +1,46 @@ +class Solution: + def isValid(self, s: str) -> bool: + seen_open_brackets = [] + close_bracket_to_open_bracket = {")":"(", "}":"{", "]":"["} + open_brackets = close_bracket_to_open_bracket.values() # cheeseNAさんを参考に + for char in s: + if char in open_brackets: + # FIFO + seen_open_brackets.append(char) + + elif char in close_bracket_to_open_bracket: + if len(seen_open_brackets) == 0: + return False + + if seen_open_brackets.pop() != close_bracket_to_open_bracket[char]: + # 最後に見たopen bracketと対応してないclose bracketが出てきてしまった場合 + return False + + # もし全ての作業を終えてもopen bracketがdequeに残っていたら使い切っていないということ + return not seen_open_brackets + +"""Reference +nittocoさん: https://github.com/nittoco/leetcode/pull/5/files +step3でopen bracketを消していた。個人的にはあった方が頭がこんがらないけど, この辺は人の好みでしょうか。 +dequeを使わずにlistの最後を取り出すでも良いのかとなった。 + +cheeseNAさん: https://github.com/cheeseNA/leetcode/pull/10/files +かなり早いし読めるコードだし見習うところがありました。last_seen_open_bracketと命名したい気持ちはあるけど + +if last_seen_open_bracket != close_bracket_to_open_bracket[char]: + # 最後に見たopen bracketと対応してないclose bracketが出てきてしまった場合 + return False + +if len(seen_open_brackets) != 0: + # FIFO + last_seen_open_bracket = seen_open_brackets.popleft() + +って感じにするよりかは, +if len(seen_open_brackets) == 0: + return False +if seen_open_brackets.popleft() != close_bracket_to_open_bracket[char]: + return False +にしたほうが確かにいいですね + +あとreturn not seen_open_bracketsと書いた方がpythonっぽいのでしょうか...? +""" \ No newline at end of file diff --git a/valid_parentheses/phase3.py b/valid_parentheses/phase3.py new file mode 100644 index 0000000..572087c --- /dev/null +++ b/valid_parentheses/phase3.py @@ -0,0 +1,19 @@ +class Solution: + def isValid(self, s: str) -> bool: + close_brackets_to_open_brackets = {")":"(", "}": "{", "]": "["} + open_brackets = close_brackets_to_open_brackets.values() + seen_open_brackets = [] #既にみたopen bracket + for char in s: + if char in open_brackets: + # 追加 + seen_open_brackets.append(char) + + elif char in close_brackets_to_open_brackets: + if len(seen_open_brackets) == 0: + # seen_open_bracketsが空の場合, 対応するopen_bracketはない + return False + + elif close_brackets_to_open_brackets[char] != seen_open_brackets.pop(): + return False + # もし空じゃないなら未処理のopen_bracketが残っている + return not seen_open_brackets \ No newline at end of file