From af296caa25ef0b06499bff8b2232ef5383e16bb0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 17 Jun 2026 14:33:19 +0000 Subject: [PATCH 1/7] docs: add memo.md template for new branch --- memo.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 memo.md diff --git a/memo.md b/memo.md new file mode 100644 index 0000000..8718ebb --- /dev/null +++ b/memo.md @@ -0,0 +1,16 @@ +## 今回解いた問題と次に解く問題 +- 今回解いた問題: +- 次に解く問題: + +## Step 1 +```python + +``` +## Step 2 +```python + +``` +## Step 3 +```python + +``` From 155bea79c4b23a9a743937b2283f77111df25b54 Mon Sep 17 00:00:00 2001 From: Yoshifumi Munakata Date: Tue, 23 Jun 2026 14:50:04 +0900 Subject: [PATCH 2/7] 06231339 --- memo.md | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/memo.md b/memo.md index 8718ebb..1eb31d4 100644 --- a/memo.md +++ b/memo.md @@ -1,10 +1,49 @@ ## 今回解いた問題と次に解く問題 -- 今回解いた問題: -- 次に解く問題: +- 今回解いた問題:20. Valid Parentheses(https://leetcode.com/problems/valid-parentheses/description/?envType=problem-list-v2&envId=xo2bgr0r) +- 次に解く問題:703. Kth Largest Element in a Stream(https://leetcode.com/problems/kth-largest-element-in-a-stream/?envType=problem-list-v2&envId=xo2bgr0r) ## Step 1 -```python +### 考えたこと +スタックに([{が来るたびに一つずつ積んでいって、)]}が来るたびに一つずつスタックからpopしていく。スタックの名前がスタックなのは少し嫌だと思ったが、他に思いつかなかったのでとりあえずstackにした。時間計算量はO(n)、空間計算量もO(n)。 +分岐が多くて読みづらいので、もう少し読みやすく書けないかと思った。 +```python +class Solution: + def isValid(self, s: str) -> bool: + stack = [] + if not s: + return True + for c in s: + if c in "([{": + stack.append(c) + elif c == ")": + if not stack: + return False + last = stack.pop() + if last == "(": + continue + else: + return False + elif c == "]": + if not stack: + return False + last = stack.pop() + if last == "[": + continue + else: + return False + elif c == "}": + if not stack: + return False + last = stack.pop() + if last == "{": + continue + else: + return False + if not stack: + return True + else: + return False ``` ## Step 2 ```python From e8c2a99c01f1efeac3c2892b7f620c9d75df63e1 Mon Sep 17 00:00:00 2001 From: fumi1326 Date: Thu, 2 Jul 2026 18:03:25 +0900 Subject: [PATCH 3/7] 0630 --- memo.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/memo.md b/memo.md index 1eb31d4..8c735f8 100644 --- a/memo.md +++ b/memo.md @@ -46,6 +46,11 @@ class Solution: return False ``` ## Step 2 +### 読んだコード +- https://github.com/bumbuboon/Leetcode/pull/7/changes + +### 考えたこと +- 先に[と]みたいにペアを作っておく。 ```python ``` From 700bd2ee8d3714b445b8acb5c113be8cc34d03df Mon Sep 17 00:00:00 2001 From: fumi1326 Date: Thu, 9 Jul 2026 22:14:26 +0900 Subject: [PATCH 4/7] 07092215 --- memo.md | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/memo.md b/memo.md index 8c735f8..10d6fed 100644 --- a/memo.md +++ b/memo.md @@ -48,13 +48,34 @@ class Solution: ## Step 2 ### 読んだコード - https://github.com/bumbuboon/Leetcode/pull/7/changes +- https://github.com/philip82148/leetcode-swejp/pull/11/changes ### 考えたこと -- 先に[と]みたいにペアを作っておく。 -```python +- 先に[と]みたいにペアを作っておく。open_to_closeのような名前のdictionary型変数がいいか。 +- return(len(stack) == 0)だと可読性が高い +- スタックの名前がstackの代わりの名前として、open_blacketsなどがある。 +- if not stackの分岐を避けるためにあらかじめstackの中に番兵(\0などの目印)を入れておくのも有効。 +```python +class Solution: + def isValid(self, s: str) -> bool: + open_blackets = [] + open_to_close = {'(' : ')', + '{' : '}', + '[' : ']'} + for c in s: + if c in open_to_close: + open_blackets.append(c) + elif not open_blackets: + return False + else: + last = open_blackets.pop() + if open_to_close[last] != c: + return False + return (len(open_blackets) == 0) ``` ## Step 3 +番兵を使って書いてみる。 ```python ``` From 9aae714c0a12acdb73fdc4ad7928085b98502fe7 Mon Sep 17 00:00:00 2001 From: fumi1326 Date: Thu, 9 Jul 2026 22:36:47 +0900 Subject: [PATCH 5/7] 0709 --- memo.md | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/memo.md b/memo.md index 10d6fed..84b552d 100644 --- a/memo.md +++ b/memo.md @@ -53,29 +53,43 @@ class Solution: ### 考えたこと - 先に[と]みたいにペアを作っておく。open_to_closeのような名前のdictionary型変数がいいか。 - return(len(stack) == 0)だと可読性が高い -- スタックの名前がstackの代わりの名前として、open_blacketsなどがある。 -- if not stackの分岐を避けるためにあらかじめstackの中に番兵(\0などの目印)を入れておくのも有効。 +- スタックの名前がstackの代わりの名前として、open_bracketsなどがある。 +- if not stackの分岐を避けるためにあらかじめstackの中に番兵(Cだと\0などの目印、PythonだとNoneなどか?(->Noneだとdictにアクセスできないので#など))を入れておくのも有効。 ```python class Solution: def isValid(self, s: str) -> bool: - open_blackets = [] + open_brackets = [] open_to_close = {'(' : ')', '{' : '}', '[' : ']'} for c in s: if c in open_to_close: - open_blackets.append(c) - elif not open_blackets: + open_brackets.append(c) + elif not open_brackets: return False else: - last = open_blackets.pop() + last = open_brackets.pop() if open_to_close[last] != c: return False - return (len(open_blackets) == 0) + return (len(open_brackets) == 0) ``` ## Step 3 -番兵を使って書いてみる。 -```python +- 番兵を使って書いてみる。dictへのアクセスは結局その中にキーがあるかを確認する必要があるので、分岐の数自体は変わらないが、分岐より先にpopできるのが直感的でわかりやすい。 +```python +class Solution: + def isValid(self, s: str) -> bool: + open_to_close = {'(' : ')', + '{' : '}', + '[' : ']'} + open_brackets = [None] # Put None as a sentinel + for bracket in s: + if bracket in open_to_close: + open_brackets.append(bracket) + else: + last = open_brackets.pop() + if not last or bracket != open_to_close[last]: + return False + return (len(open_brackets) == 1) # Check only the sentinel left ``` From 9199f4ea3d0a569f7371f5805a0938e7b963d050 Mon Sep 17 00:00:00 2001 From: fumi1326 Date: Thu, 9 Jul 2026 22:38:29 +0900 Subject: [PATCH 6/7] step3 --- memo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/memo.md b/memo.md index 84b552d..6805a75 100644 --- a/memo.md +++ b/memo.md @@ -54,7 +54,7 @@ class Solution: - 先に[と]みたいにペアを作っておく。open_to_closeのような名前のdictionary型変数がいいか。 - return(len(stack) == 0)だと可読性が高い - スタックの名前がstackの代わりの名前として、open_bracketsなどがある。 -- if not stackの分岐を避けるためにあらかじめstackの中に番兵(Cだと\0などの目印、PythonだとNoneなどか?(->Noneだとdictにアクセスできないので#など))を入れておくのも有効。 +- if not stackの分岐を避けるためにあらかじめstackの中に番兵(Cだと\0などの目印、PythonだとNoneなどか?)を入れておくのも有効。 ```python class Solution: From 5f8028e89581967f352927a5f8d43503c4c1ccc0 Mon Sep 17 00:00:00 2001 From: fumi1326 Date: Fri, 10 Jul 2026 14:09:20 +0900 Subject: [PATCH 7/7] estimation of execution time was added --- executiontime_test.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 executiontime_test.py diff --git a/executiontime_test.py b/executiontime_test.py new file mode 100644 index 0000000..b346db4 --- /dev/null +++ b/executiontime_test.py @@ -0,0 +1,36 @@ +import timeit + + +class Solution: + def isValid(self, s: str) -> bool: + open_to_close = { + '(': ')', + '{': '}', + '[': ']' + } + + open_brackets = [None] # Put None as a sentinel + + for bracket in s: + if bracket in open_to_close: + open_brackets.append(bracket) + else: + last = open_brackets.pop() + + if not last or bracket != open_to_close[last]: + return False + + return len(open_brackets) == 1 + + +solution = Solution() + +s = "()" * 5000 + +total_time = timeit.timeit( + lambda: solution.isValid(s), + number = 1 +) + +print(f"入力文字数: {len(s):,}") +print(f"合計実行時間: {total_time * 1_000_000:.3f} us") \ No newline at end of file