C++で括弧を追加するさまざまな方法
一連の数値と演算子があるとすると、数値と演算子をグループ化するためのさまざまな可能な方法をすべて計算することで、考えられるすべての結果を見つける必要があります。ここで、有効な演算子は+、-、および*です。したがって、入力が「2 * 3-4 * 5」の場合、出力は[-34、-14、-10、-10、10]になります。これは-
-
(2 *(3-(4 * 5)))=-34
-
((2 * 3)-(4 * 5))=-14
-
((2 *(3-4))* 5)=-10
-
(2 *((3-4)* 5))=-10
-
(((2 * 3)-4)* 5)=10
これを解決するには、次の手順に従います-
-
メモと呼ばれる地図を定義します。
-
Solve()というメソッドを定義します。これにより、入力文字列が入力として使用されます。
-
ret
という配列を作成します -
メモに入力がある場合は、memo [input]
を返します。 -
0から入力文字列のサイズまでの範囲のiの場合-
-
input [i]がサポートされている演算子の場合、
-
配列part1:=solve(0からi-1までの入力の部分文字列)
-
配列part2:=resolve(iから文字列の終わりまでの入力の部分文字列)
-
0からpart1のサイズまでの範囲のjの場合
-
0からpart2のサイズまでの範囲のkの場合
-
input [i]が加算の場合、
-
part [j] + part [k]を実行し、retに追加
-
-
input [i]が乗算の場合、
-
part [j] *part[k]を実行してretに追加
-
-
input [i]が減算の場合、
-
part [j]--part[k]を実行してretに追加
-
-
-
-
-
-
retが空の場合、入力文字列を整数として返します
-
memo [input]:=ret、return ret
例(C ++)
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: map <string, vector<int>> memo; vector<int> diffWaysToCompute(string input) { vector <int> ret; if(memo.count(input)) return memo[input]; for(int i = 0; i < input.size(); i++){ if(input[i] == '+' || input[i] == '*' || input[i] == '-'){ vector <int> part1 = diffWaysToCompute(input.substr(0, i)); vector <int> part2 = diffWaysToCompute(input.substr(i + 1)); for(int j = 0; j < part1.size(); j++ ){ for(int k = 0; k < part2.size(); k++){ if(input[i] == '+'){ ret.push_back(part1[j] + part2[k]); } else if(input[i] == '*'){ ret.push_back(part1[j] * part2[k]); } else { ret.push_back(part1[j] - part2[k]); } } } } } if(ret.empty()){ ret.push_back(stoi(input)); } return memo[input] = ret; } }; main(){ Solution ob; print_vector(ob.diffWaysToCompute("2*3-4*5")); }
入力
"2*3-4*5"
出力
[-34, -10, -14, -10, 10, ]
-
C++で2つの異なるセットから1つ以上のペアを選択する方法
この問題では、2つの正の数nとm(n <=m)が与えられます。これは、それぞれ2つのセットのアイテムの総数です。私たちの仕事は、これらのセットのアイテムからペア(1つ以上)を選択する方法の総数を見つけることです。 問題を理解するために例を見てみましょう 入力 2 2 出力 6 説明 2つの要素を持つ2つのセットがあります Set A = {1, 2} Set B = {3, 4} 一度に1つのペアを配置する方法、(1..3)、(1 ... 4)、(2..3)、(2 ... 4) 一度に2つのペアを配置する方法、(1 ... 3、2 ... 4)、(1 ... 4、2 ... 3) こ
-
TwoSumIV-入力はC++のBSTです
二分探索木と1つのターゲット値があるとします。合計が指定されたターゲットと等しくなるように、BSTに2つの要素が存在するかどうかを確認する必要があります。 したがって、入力が次のような場合 その場合、出力はTrueになります。 これを解決するには、次の手順に従います- 配列を定義するv 関数inorder()を定義します。これはルートになります ルートがnullの場合、- 戻る 順序なし(ルートの左側) ルートの値をvに挿入 順序なし(ルートの左側) 関数findnode()を定義します。これにはkがかかります n:=vのサ