84. Different Ways to Add Parentheses


道しるべ
  • の数値と演算子を入力し、可能なすべての組合せ結果
  • を出力します.


    1.分割征服による複数の組合せ

    
    
    class Solution:
        def diffWaysToCompute(self, expression: str) -> List[int]:
            
            def compute(left, right, op):
                results = []
                
                for l in left:
                    for r in right:
                        results.append(eval(str(l) + op + str(r)))
                    
                return results
            
            if expression.isdigit():
                return [int(expression)]
                
            results = []
            
            for index, value in enumerate(expression):
                if value in "-+*":
                    left = self.diffWaysToCompute(expression[:index])
                    right = self.diffWaysToCompute(expression[index + 1:])
                    
                    results.extend(compute(left, right, value))
            return results
    
    

  • かっこをどこに追加するかによって、いろいろな組み合わせができます.すべての組合せを計算します.これは、次の分割によって征服できます.
  • *, -, +演算子が現れると、左右に分割し、それぞれ計算結果を返します.
  • 3-4*5-17-5の複数の計算結果があり、最終的には2 * [17, -5]の計算結果[-34, -10]が返されます.

  • 省略したが,右側はそれぞれ異なる計算結果を返し,最終的には[-34, -14, -10, -10, 10]という5つの結果を返す.

  • 演算子を基準として、leftrightを分割し続け、分割後の値はcompute()関数で計算した結果をextend()に拡張する.
  • append()リスト全体を別の要素として処理[1,2,3,[4,5]]
  • extend()は、挿入されたオブジェクトのリストを展開し、各エンティティに拡張する.[1,2,3,4,5]

  • 分割結果を得るためには,expressionがデジタル型の場合に復元する.
  • のように分割された結果は、最終的には、再帰的な最終結果として数値型のタイプを返す.

  • 図中の最後の計算の前に、right[-17, -5]であった.

  • 複数型である可能性があるため,単数型値をそれぞれ繰り返し抽出して計算する.

  • リストコンパイルで処理できますが、可読性を高めるために解凍します.
  • eval()関数は、文字列をグループ化し、Python式で処理します.