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

为了解决这个问题,我们将遵循以下步骤 -

  • 定义一个名为 memo 的映射。

  • 定义一个名为 solve() 的方法。这将以输入字符串作为输入。

  • 创建一个名为 ret 的数组

  • 如果 memo 包含输入,则返回 memo[input]

  • 对于 i 从 0 到输入字符串的大小 -

    • 如果 input[i] 是任何受支持的运算符,则

      • 一个数组 part1 := solve(从 0 到 i - 1 的输入子字符串)

      • 一个数组 part2 := solve(从 i 到字符串末尾的输入子字符串)

      • 对于 j 从 0 到 part1 的大小

        • 对于 k 从 0 到 part2 的大小

          • 如果 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,并返回 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, ]

更新于: 2020年5月2日

844 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告