diff --git a/generate_parentheses/phase1.py b/generate_parentheses/phase1.py new file mode 100644 index 0000000..41dc159 --- /dev/null +++ b/generate_parentheses/phase1.py @@ -0,0 +1,31 @@ +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + valid_parentheses = [] + under_processing_parentheses = ["("] + while under_processing_parentheses: + current_parenthesis = under_processing_parentheses.pop() + open_bracket_count = current_parenthesis.count("(") + closed_bracket_count = current_parenthesis.count(")") + + add_parentheses = [] + if closed_bracket_count == open_bracket_count: + # closed_bracket_count == open_bracket_countな状態でclosed_bracketを追加するとinvalidな状態になる + add_parentheses.append(current_parenthesis + "(") + elif open_bracket_count == n: + # open_bracketを使い切ったら文字列の長さが2*nになるまでclosed_bracketを追加 + add_parentheses.append(current_parenthesis + ")") + else: + # それ以外はどのbracketを使い切ってもvalidな状態になりえる途中経過状態になる + add_parentheses.append(current_parenthesis + "(") + add_parentheses.append(current_parenthesis + ")") + + for add_parenthesis in add_parentheses: + if len(add_parenthesis) == 2*n: + # terminate + valid_parentheses.append(add_parenthesis) + + else: + # 追加 + under_processing_parentheses.append(add_parenthesis) + + return valid_parentheses \ No newline at end of file diff --git a/generate_parentheses/phase2.py b/generate_parentheses/phase2.py new file mode 100644 index 0000000..1c65778 --- /dev/null +++ b/generate_parentheses/phase2.py @@ -0,0 +1,30 @@ +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + valid_parentheses = [] + under_processing_parentheses = [("", n, n)] #initial state + + while under_processing_parentheses: + current_parentheses, remain_open_bracket_count, remain_close_bracket_count = under_processing_parentheses.pop() + if remain_open_bracket_count == 0 and remain_close_bracket_count == 0: + valid_parentheses.append(current_parentheses) + continue + + if 0 < remain_open_bracket_count: + under_processing_parentheses.append((current_parentheses + "(", remain_open_bracket_count - 1, remain_close_bracket_count)) + if remain_open_bracket_count < remain_close_bracket_count: + under_processing_parentheses.append((current_parentheses + ")", remain_open_bracket_count, remain_close_bracket_count - 1)) + + return valid_parentheses + +""" +phase1と同じようにvalidな状態から終了状態までの遷移グラフを追うようなコードにした + +Reference: +https://github.com/ryoooooory/LeetCode/pull/6/files +refactoredSolution2.javaが近いのかなと感じた。 + +https://github.com/shining-ai/leetcode/pull/53/files +再帰で解く解き方も確かにできますね。level4のコードが綺麗ですし, 僕のphase1のコードで感じていた +add_parenthesisとadd_parenthesesを複数形と単数系で区別するのはなんだか認知負荷がかかるなあという思いがあったのでとても参考になりました。 + +""" \ No newline at end of file diff --git a/generate_parentheses/phase3.py b/generate_parentheses/phase3.py new file mode 100644 index 0000000..73468e1 --- /dev/null +++ b/generate_parentheses/phase3.py @@ -0,0 +1,20 @@ +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + valid_parentheses = [] # 有効な答えを格納するコンテナ + under_processing_parentheses = [("", n, n)] # stack + while under_processing_parentheses: + current_parentheses, remain_open_bracket_count, remain_close_bracket_count = under_processing_parentheses.pop() + + if remain_open_bracket_count == 0 and remain_close_bracket_count == 0: + valid_parentheses.append(current_parentheses) + continue + + if 0 < remain_open_bracket_count: + # 使える(があるときはいつ加えてもvalidなparenthesesになる + under_processing_parentheses.append((current_parentheses + "(", remain_open_bracket_count - 1, remain_close_bracket_count)) + + if remain_open_bracket_count < remain_close_bracket_count: + # remain_open_bracket_count < remain_close_bracket_count の時だけvalidなparenthesesが作れる + under_processing_parentheses.append((current_parentheses + ")",remain_open_bracket_count, remain_close_bracket_count - 1)) + + return valid_parentheses \ No newline at end of file diff --git a/generate_parentheses/phase4.py b/generate_parentheses/phase4.py new file mode 100644 index 0000000..1726344 --- /dev/null +++ b/generate_parentheses/phase4.py @@ -0,0 +1,38 @@ +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + # 状態を格納する変数を少なくするアプローチ + valid_parentheses = [] # 有効な答えを格納するコンテナ + under_processing_parentheses = [""] # stack + while under_processing_parentheses: + current_parentheses = under_processing_parentheses.pop() + + if current_parentheses.count("(") == n and current_parentheses.count(")") == n: + valid_parentheses.append(current_parentheses) + continue + + if current_parentheses.count("(") < n: + # 使える(があるときはいつ加えてもvalidなparenthesesになる + under_processing_parentheses.append(current_parentheses + "(") + + if current_parentheses.count(")") < current_parentheses.count("("): + under_processing_parentheses.append(current_parentheses + ")") + + return valid_parentheses + +# 再帰で書く場合 + +class Solution: + def generateParenthesis(self, n: int) -> List[str]: + def _generate_valid_parentheses(current_parenthesis: str, n: int)->List[str]: + if current_parenthesis.count("(") == n and current_parenthesis.count(")") == n: + return [current_parenthesis] + + valid_parentheses = [] + if current_parenthesis.count("(") < n: + valid_parentheses += _generate_valid_parentheses(current_parenthesis + "(", n) + if current_parenthesis.count(")") < current_parenthesis.count("("): + valid_parentheses += _generate_valid_parentheses(current_parenthesis + ")", n) + + return valid_parentheses + + return _generate_valid_parentheses("", n) \ No newline at end of file