c++实现添加括号的不同方式

  介绍

本篇内容介绍了“C + +实现添加括号的不同方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

添加括号的不同方式

给定一个字符串的数字和运算符,返回所有可能结果计算所有可能的不同组数字和运算符的方法。有效的经营者断开连接;+,安康;以及*。

示例1:输入:

“2-1-1"

输出:

(0, 2)

解释:
((2 - 1) 1)=0
(2 - (1 - 1))=2

示例2:

输入:“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

这道题让给了一个可能含有加减乘的表达式,让我们在任意位置添加括号,求出所有可能表达式的不同值。这道题乍一看感觉还蛮难的,给人的感觉是既要在不同的位置上加括号,又要计算表达式的值,结果一看还是道介质的题,直接尼克杨问号脸? !遇到了难题不要害怕,从最简单的例子开始分析,慢慢的找规律,十有八九就会在分析的过程中灵光一现,找到了破题的方法。这道题貌似默认输入都必须是合法的,虽然题目中没有明确的指出这一点,所以我们也就不必进行有效的验证了。先从最简单的输入开始,若输入是空串,那就返回一个空数组。若输入是一个数字的话,那么括号加与不加其实都没啥区别,因为不存在计算,但是需要将字符串转为整型数,因为返回的是一个整型数组。当然,输入是一个单独的运算符这种情况是不存在的,因为前面说了这道题默认输入的合法的。下面来看若输入是数字和运算符的时候,比如“1 + 1”;这种情况,那么加不加括号也没有任何影响,因为只有一个计算,结果一定是2。再复杂一点的话,比如题目中的例子1,输入是“2-1-1"时,就有两种情况了,(2)1和2 -(1 - 1),由于括号的不同,得到的结果也不同,但如果我们把括号里的东西当作一个黑箱的话,那么其就变为(1),和2 -(),其最终的结果跟括号内可能得到的值是息息相关的,那么再一般一点,实际上就可以变成()?()这种形式,两个括号内分别是各自的表达式,最终会分别计算得到两个整型数组,中间的问号表示运算符,可以是加,减,或乘。那么问题就变成了从两个数组中任意选两个数字进行运算,瞬间变成我们会做的题目了有木有?而这种左右两个括号代表的黑盒子就交给递归去计算,像这种分成左右两坨的模式就是大名鼎鼎的分治法分治了,是必须要掌握的一个神器。类似的题目还有之前的那道,独特的二叉搜索树II 用的方法一样,用递归来解,划分左右子树,递归构造。

好,继续来说这道题,我们不用新建递归函数,就用其本身来递归就行,先建立一个结果res数组,然后遍历中输入的字符,根据上面的分析,我们希望在每个运算符的地方,将输入分成左右两部分,从而扔到递归中去计算,从而可以得到两个整型数组左和右,分别表示作用两部分各自添加不同的括号所能得到的所有不同的值,此时我们只要分别从两个数组中取数字进行当前的运算符计算,然后把结果存到res中即可。当然,若最终结果res中还是空的,那么只有一种情况,输入本身就是一个数字,直接转为整型存入结果res中即可,参见代码如下:

解法一:

class  Solution  {   公众:   ,,,vector, diffWaysToCompute (string 输入),{   ,,,,,,,vector, res;   ,,,,,,,for  (int 小姐:=,0;,小姐:& lt;, input.size ();, + + i), {   ,,,,,,,,,,,if (输入[我],==,& # 39;+ & # 39;,| |,输入[我],==,& # 39;& # 39;,| |,输入[我],==,& # 39;* & # 39;),{   ,,,,,,,,,,,,,,,vector, left =, diffWaysToCompute (input.substr(0,,我));   ,,,,,,,,,,,,,,,vector, right =, diffWaysToCompute (input.substr(小姐:+,- 1));   ,,,,,,,,,,,,,,,for  (int  j =, 0;, j  & lt;, left.size ();, + + j), {   ,,,,,,,,,,,,,,,,,,,for  (int  k =, 0;, k  & lt;, right.size ();, + + k), {   ,,,,,,,,,,,,,,,,,,,,,,,if (输入[我],==,& # 39;+ & # 39;),res.push_back(左[j], +, [k]);   ,,,,,,,,,,,,,,,,,,,,,,,else  if (输入[我],==,& # 39;& # 39;),res.push_back(左[j],安康;对[k]);   ,,,,,,,,,,,,,,,,,,,,,,,else  res.push_back(左[j], *,正确的[k]);   ,,,,,,,,,,,,,,,,,,,}   ,,,,,,,,,,,,,,,}   ,,,,,,,,,,,}   ,,,,,,,}   ,,,,,,,if  (res.empty ()), res.push_back (stoi(输入);   ,,,,,,,return  res;   ,,,}   };

c++实现添加括号的不同方式