From 561ff5ed32f0de14662b5f259cb585c2796d67fe Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Mon, 22 Apr 2024 01:00:17 +0900 Subject: [PATCH 1/7] phase1 --- valid_parentheses/phase1.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 valid_parentheses/phase1.py diff --git a/valid_parentheses/phase1.py b/valid_parentheses/phase1.py new file mode 100644 index 0000000..77ada45 --- /dev/null +++ b/valid_parentheses/phase1.py @@ -0,0 +1,23 @@ +from collections import deque + +class Solution: + def isValid(self, s: str) -> bool: + last_seen_open_brankets = deque([]) + last_seen_open_branket = "" + open_brankets = set(["(", "[", "{"]) + close_branket_to_open_branket = {")":"(", "}":"{", "]":"["} + for char in s: + if char in open_brankets: + last_seen_open_brankets.appendleft(last_seen_open_branket) + last_seen_open_branket = char + + elif char in close_branket_to_open_branket: + if last_seen_open_branket != close_branket_to_open_branket[char]: + return False + if len(last_seen_open_brankets) != 0: + last_seen_open_branket = last_seen_open_brankets.popleft() + + if len(last_seen_open_brankets) != 0: + return False + + return True \ No newline at end of file From 5faf7a81046562c09fed951285f1122e2d55142a Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Mon, 22 Apr 2024 01:02:11 +0900 Subject: [PATCH 2/7] =?UTF-8?q?phase1=20=E8=AA=AC=E6=98=8E=E8=BF=BD?= =?UTF-8?q?=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- valid_parentheses/phase1.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/valid_parentheses/phase1.py b/valid_parentheses/phase1.py index 77ada45..9dfcbe3 100644 --- a/valid_parentheses/phase1.py +++ b/valid_parentheses/phase1.py @@ -1,3 +1,12 @@ +# in-validとなるとき +# ある種類のopen branketの出現回数が0なのにclosed branketが出てくる +# closed branketが出てきた時, open branketに他の種類のものが紛れ込んでいる +# 全ての作業が終わった後, open branketの数が0になっていない + +# ↑...という回答を真っ先に思い浮かんだが, 何か考えすぎているきがした。 +# 明らかにおかしいのでもう少し問題の性質をちゃんと考えてみることに +# dequeを使って最後に見たopen branketを管理するFIFOにすればいいことに気付き, 採用 + from collections import deque class Solution: From 079e91c6894f100595db79378f789e07f9755231 Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Mon, 22 Apr 2024 01:03:40 +0900 Subject: [PATCH 3/7] =?UTF-8?q?phase2.py=20=E5=90=8D=E5=90=8D=E5=A4=89?= =?UTF-8?q?=E6=9B=B4,=20last=20seen=E3=81=AA=E3=81=AE=E3=81=8Cdeque?= =?UTF-8?q?=E3=81=AE=E8=A6=81=E7=B4=A0=E3=81=A7=E3=81=AF=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=81=8B=E3=82=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- valid_parentheses/phase2.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 valid_parentheses/phase2.py diff --git a/valid_parentheses/phase2.py b/valid_parentheses/phase2.py new file mode 100644 index 0000000..482525d --- /dev/null +++ b/valid_parentheses/phase2.py @@ -0,0 +1,23 @@ +from collections import deque + +class Solution: + def isValid(self, s: str) -> bool: + seen_open_brankets = deque([]) + last_seen_open_branket = "" + open_brankets = set(["(", "[", "{"]) + close_branket_to_open_branket = {")":"(", "}":"{", "]":"["} + for char in s: + if char in open_brankets: + seen_open_brankets.appendleft(last_seen_open_branket) + last_seen_open_branket = char + + elif char in close_branket_to_open_branket: + if last_seen_open_branket != close_branket_to_open_branket[char]: + return False + if len(seen_open_brankets) != 0: + last_seen_open_branket = seen_open_brankets.popleft() + + if len(seen_open_brankets) != 0: + return False + + return True \ No newline at end of file From b129007615bdeac0b0408d27b7d7d0a99dbe6318 Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Mon, 22 Apr 2024 01:23:26 +0900 Subject: [PATCH 4/7] phase 2 --- valid_parentheses/phase2.py | 47 +++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/valid_parentheses/phase2.py b/valid_parentheses/phase2.py index 482525d..e2d3fb6 100644 --- a/valid_parentheses/phase2.py +++ b/valid_parentheses/phase2.py @@ -4,20 +4,47 @@ class Solution: def isValid(self, s: str) -> bool: seen_open_brankets = deque([]) last_seen_open_branket = "" - open_brankets = set(["(", "[", "{"]) close_branket_to_open_branket = {")":"(", "}":"{", "]":"["} + open_brankets = close_branket_to_open_branket.values() # cheeseNAさんを参考に for char in s: if char in open_brankets: - seen_open_brankets.appendleft(last_seen_open_branket) - last_seen_open_branket = char + # FIFO + seen_open_brankets.append(char) elif char in close_branket_to_open_branket: - if last_seen_open_branket != close_branket_to_open_branket[char]: + if len(seen_open_brankets) == 0: return False - if len(seen_open_brankets) != 0: - last_seen_open_branket = seen_open_brankets.popleft() + + if seen_open_brankets.pop() != close_branket_to_open_branket[char]: + # 最後に見たopen branketと対応してないclose branketが出てきてしまった場合 + return False + + # もし全ての作業を終えてもopen branketがdequeに残っていたら使い切っていないということ + return not seen_open_brankets + +"""Reference +nittocoさん: https://github.com/nittoco/leetcode/pull/5/files +step3でopen branketを消していた。個人的にはあった方が頭がこんがらないけど, この辺は人の好みでしょうか。 +dequeを使わずにlistの最後を取り出すでも良いのかとなった。dequeを使うと個人的にfifoとかするぞって宣言の気持ちがあるのですが, +ここはソフトウェアエンジニアの方にぜひ聞いてみたいです。 + +cheeseNAさん: https://github.com/cheeseNA/leetcode/pull/10/files +かなり早いし読めるコードだし見習うところがありました。last_seen_open_branketと命名したい気持ちはあるけど + +if last_seen_open_branket != close_branket_to_open_branket[char]: + # 最後に見たopen branketと対応してないclose branketが出てきてしまった場合 + return False + +if len(seen_open_brankets) != 0: + # FIFO + last_seen_open_branket = seen_open_brankets.popleft() + +って感じにするよりかは, +if len(seen_open_brankets) == 0: + return False +if seen_open_brankets.popleft() != close_branket_to_open_branket[char]: + return False +にしたほうが確かにいいですね - if len(seen_open_brankets) != 0: - return False - - return True \ No newline at end of file +あとreturn not seen_open_branketsと書いた方がpythonっぽいのでしょうか...? +""" \ No newline at end of file From 38b7d8c61939857ed76e019d4341d830ac5c0a9b Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Mon, 22 Apr 2024 01:24:42 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BD=BF=E3=81=A3=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=82=8B=E3=81=AE=E3=81=8Cdeque=E7=89=B9=E6=9C=89=E3=81=AE?= =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=81=AF=E3=81=84=E3=82=89?= =?UTF-8?q?=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=A7deque?= =?UTF-8?q?=E3=82=92=E3=82=84=E3=82=81=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- valid_parentheses/phase2.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/valid_parentheses/phase2.py b/valid_parentheses/phase2.py index e2d3fb6..c04fd22 100644 --- a/valid_parentheses/phase2.py +++ b/valid_parentheses/phase2.py @@ -1,9 +1,6 @@ -from collections import deque - class Solution: def isValid(self, s: str) -> bool: - seen_open_brankets = deque([]) - last_seen_open_branket = "" + seen_open_brankets = [] close_branket_to_open_branket = {")":"(", "}":"{", "]":"["} open_brankets = close_branket_to_open_branket.values() # cheeseNAさんを参考に for char in s: From ce556df7665f8fd708ca6c123aceaa45a2a36eed Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Mon, 22 Apr 2024 01:29:33 +0900 Subject: [PATCH 6/7] phase3 --- valid_parentheses/phase3.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 valid_parentheses/phase3.py diff --git a/valid_parentheses/phase3.py b/valid_parentheses/phase3.py new file mode 100644 index 0000000..ec528fe --- /dev/null +++ b/valid_parentheses/phase3.py @@ -0,0 +1,19 @@ +class Solution: + def isValid(self, s: str) -> bool: + close_brankets_to_open_brankets = {")":"(", "}": "{", "]": "["} + open_brankets = close_brankets_to_open_brankets.values() + seen_open_brankets = [] #既にみたopen branket + for char in s: + if char in open_brankets: + # 追加 + seen_open_brankets.append(char) + + elif char in close_brankets_to_open_brankets: + if len(seen_open_brankets) == 0: + # seen_open_branketsが空の場合, 対応するopen_branketはない + return False + + elif close_brankets_to_open_brankets[char] != seen_open_brankets.pop(): + return False + # もし空じゃないなら未処理のopen_branketが残っている + return not seen_open_brankets \ No newline at end of file From 8835c0454dce24b21d4523d149f0d3574697a8db Mon Sep 17 00:00:00 2001 From: SuperHotDogCat Date: Mon, 22 Apr 2024 01:38:39 +0900 Subject: [PATCH 7/7] sed -i 's/branket/bracket/g' --- valid_parentheses/phase1.py | 32 +++++++++++++-------------- valid_parentheses/phase2.py | 43 ++++++++++++++++++------------------- valid_parentheses/phase3.py | 22 +++++++++---------- 3 files changed, 48 insertions(+), 49 deletions(-) diff --git a/valid_parentheses/phase1.py b/valid_parentheses/phase1.py index 9dfcbe3..20899c1 100644 --- a/valid_parentheses/phase1.py +++ b/valid_parentheses/phase1.py @@ -1,32 +1,32 @@ # in-validとなるとき -# ある種類のopen branketの出現回数が0なのにclosed branketが出てくる -# closed branketが出てきた時, open branketに他の種類のものが紛れ込んでいる -# 全ての作業が終わった後, open branketの数が0になっていない +# ある種類のopen bracketの出現回数が0なのにclosed bracketが出てくる +# closed bracketが出てきた時, open bracketに他の種類のものが紛れ込んでいる +# 全ての作業が終わった後, open bracketの数が0になっていない # ↑...という回答を真っ先に思い浮かんだが, 何か考えすぎているきがした。 # 明らかにおかしいのでもう少し問題の性質をちゃんと考えてみることに -# dequeを使って最後に見たopen branketを管理するFIFOにすればいいことに気付き, 採用 +# dequeを使って最後に見たopen bracketを管理するFIFOにすればいいことに気付き, 採用 from collections import deque class Solution: def isValid(self, s: str) -> bool: - last_seen_open_brankets = deque([]) - last_seen_open_branket = "" - open_brankets = set(["(", "[", "{"]) - close_branket_to_open_branket = {")":"(", "}":"{", "]":"["} + 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_brankets: - last_seen_open_brankets.appendleft(last_seen_open_branket) - last_seen_open_branket = char + if char in open_brackets: + last_seen_open_brackets.appendleft(last_seen_open_bracket) + last_seen_open_bracket = char - elif char in close_branket_to_open_branket: - if last_seen_open_branket != close_branket_to_open_branket[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_brankets) != 0: - last_seen_open_branket = last_seen_open_brankets.popleft() + if len(last_seen_open_brackets) != 0: + last_seen_open_bracket = last_seen_open_brackets.popleft() - if len(last_seen_open_brankets) != 0: + 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 index c04fd22..beb0193 100644 --- a/valid_parentheses/phase2.py +++ b/valid_parentheses/phase2.py @@ -1,47 +1,46 @@ class Solution: def isValid(self, s: str) -> bool: - seen_open_brankets = [] - close_branket_to_open_branket = {")":"(", "}":"{", "]":"["} - open_brankets = close_branket_to_open_branket.values() # cheeseNAさんを参考に + 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_brankets: + if char in open_brackets: # FIFO - seen_open_brankets.append(char) + seen_open_brackets.append(char) - elif char in close_branket_to_open_branket: - if len(seen_open_brankets) == 0: + elif char in close_bracket_to_open_bracket: + if len(seen_open_brackets) == 0: return False - if seen_open_brankets.pop() != close_branket_to_open_branket[char]: - # 最後に見たopen branketと対応してないclose branketが出てきてしまった場合 + if seen_open_brackets.pop() != close_bracket_to_open_bracket[char]: + # 最後に見たopen bracketと対応してないclose bracketが出てきてしまった場合 return False - # もし全ての作業を終えてもopen branketがdequeに残っていたら使い切っていないということ - return not seen_open_brankets + # もし全ての作業を終えてもopen bracketがdequeに残っていたら使い切っていないということ + return not seen_open_brackets """Reference nittocoさん: https://github.com/nittoco/leetcode/pull/5/files -step3でopen branketを消していた。個人的にはあった方が頭がこんがらないけど, この辺は人の好みでしょうか。 -dequeを使わずにlistの最後を取り出すでも良いのかとなった。dequeを使うと個人的にfifoとかするぞって宣言の気持ちがあるのですが, -ここはソフトウェアエンジニアの方にぜひ聞いてみたいです。 +step3でopen bracketを消していた。個人的にはあった方が頭がこんがらないけど, この辺は人の好みでしょうか。 +dequeを使わずにlistの最後を取り出すでも良いのかとなった。 cheeseNAさん: https://github.com/cheeseNA/leetcode/pull/10/files -かなり早いし読めるコードだし見習うところがありました。last_seen_open_branketと命名したい気持ちはあるけど +かなり早いし読めるコードだし見習うところがありました。last_seen_open_bracketと命名したい気持ちはあるけど -if last_seen_open_branket != close_branket_to_open_branket[char]: - # 最後に見たopen branketと対応してないclose branketが出てきてしまった場合 +if last_seen_open_bracket != close_bracket_to_open_bracket[char]: + # 最後に見たopen bracketと対応してないclose bracketが出てきてしまった場合 return False -if len(seen_open_brankets) != 0: +if len(seen_open_brackets) != 0: # FIFO - last_seen_open_branket = seen_open_brankets.popleft() + last_seen_open_bracket = seen_open_brackets.popleft() って感じにするよりかは, -if len(seen_open_brankets) == 0: +if len(seen_open_brackets) == 0: return False -if seen_open_brankets.popleft() != close_branket_to_open_branket[char]: +if seen_open_brackets.popleft() != close_bracket_to_open_bracket[char]: return False にしたほうが確かにいいですね -あとreturn not seen_open_branketsと書いた方がpythonっぽいのでしょうか...? +あとreturn not seen_open_bracketsと書いた方がpythonっぽいのでしょうか...? """ \ No newline at end of file diff --git a/valid_parentheses/phase3.py b/valid_parentheses/phase3.py index ec528fe..572087c 100644 --- a/valid_parentheses/phase3.py +++ b/valid_parentheses/phase3.py @@ -1,19 +1,19 @@ class Solution: def isValid(self, s: str) -> bool: - close_brankets_to_open_brankets = {")":"(", "}": "{", "]": "["} - open_brankets = close_brankets_to_open_brankets.values() - seen_open_brankets = [] #既にみたopen branket + 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_brankets: + if char in open_brackets: # 追加 - seen_open_brankets.append(char) + seen_open_brackets.append(char) - elif char in close_brankets_to_open_brankets: - if len(seen_open_brankets) == 0: - # seen_open_branketsが空の場合, 対応するopen_branketはない + elif char in close_brackets_to_open_brackets: + if len(seen_open_brackets) == 0: + # seen_open_bracketsが空の場合, 対応するopen_bracketはない return False - elif close_brankets_to_open_brankets[char] != seen_open_brankets.pop(): + elif close_brackets_to_open_brackets[char] != seen_open_brackets.pop(): return False - # もし空じゃないなら未処理のopen_branketが残っている - return not seen_open_brankets \ No newline at end of file + # もし空じゃないなら未処理のopen_bracketが残っている + return not seen_open_brackets \ No newline at end of file