【LeetCode 241】Different Ways to Add Parentheses

解析复杂表达式的多种计算方式
本文探讨如何通过改变运算顺序来计算一个包含数字和基本运算符的表达式的多种可能结果,采用递归方法实现,并提供了C++代码实现示例。

Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are+- and *.

Example :

Input: "2*3-4*5"

(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

Output: [-34, -14, -10, -10, 10]

题意:

  给一串表达式(由+、-、*以及数字组成),通过加括号改变运算顺序,求所有可能的结果。

思路:

  没有想到什么比较巧妙的方法,只能递归所有的可能咯,其中有很多重复计算,等找到好办法了再来更新吧。

C++:

 1 class Solution {
 2 public:
 3 
 4     //string转为int
 5     int getInts(string str)
 6     {
 7         int ret = 0;
 8 
 9         stringstream ss;
10         ss << str;
11         ss >> ret;
12 
13         return ret;
14     }
15 
16     vector<int> rec(vector<int>& num, int start, int ends)
17     {
18         vector<int> vec;
19     
20         if(start == ends)
21         {
22             vec.push_back(num[start]);
23             return vec;
24         }
25     
26         for(int i = start; i <= ends; i++)
27         {
28             if(num[i] < 0)
29             {
30                 vector<int> vecl = rec(num, start, i - 1);
31                 vector<int> vecr = rec(num, i + 1, ends);
32     
33                 vector<int>::iterator itl = vecl.begin();
34                 for(; itl != vecl.end(); itl++)
35                 {
36                     vector<int>::iterator itr = vecr.begin();
37                     for(; itr != vecr.end(); itr++)
38                     {
39                         if(num[i] == -3)
40                             vec.push_back((*itl) + (*itr));
41                         else if(num[i] == -1)
42                             vec.push_back((*itl) - (*itr));
43                         else if(num[i] == -4)
44                             vec.push_back((*itl) * (*itr));
45                     }
46                 }
47             }
48         }
49         return vec;
50     }
51     
52     vector<int> diffWaysToCompute(string input) {
53         
54         //先把字符串转换为一个int型的数组,符号用负数来表示
55         vector<int> nums;
56         int index = 0;
57         for(int i = 0; i < input.size(); i++)
58         {
59             if(input[i] == '+' || input[i] == '-' || input[i] == '*')
60             {
61                 string str = input.substr(index, i - index);
62                 nums.push_back(getInts(str));
63                 nums.push_back(input[i]-46); //加号转换为-3, 减号转换为-1,乘号为-4
64                 index = i + 1;
65             }
66             if(i == input.size() - 1)
67             {
68                 string str = input.substr(index, input.size() - index);
69                 nums.push_back(getInts(str));
70             }
71         }
72         
73         int len = nums.size();
74         if(len == 0 || len == 1)
75             return nums;
76         
77         vector<int> ret = rec(nums, 0, len - 1);
78         return ret;
79     }
80 };

AC: https://leetcode.com/submissions/detail/34708590/

转载于:https://www.cnblogs.com/tjuloading/p/4680576.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值