Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions valid_parentheses/phase1.py
Original file line number Diff line number Diff line change
@@ -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
46 changes: 46 additions & 0 deletions valid_parentheses/phase2.py
Original file line number Diff line number Diff line change
@@ -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っぽいのでしょうか...?
"""
19 changes: 19 additions & 0 deletions valid_parentheses/phase3.py
Original file line number Diff line number Diff line change
@@ -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