• leet:地址
  • 分类:分治法(+递归)
  • 题目描述:
    • 给定一串由数字和操作符构成的字符串,通过对其加所有可能形式的括号,求出该字符串所有可能的取值。有效的操作符为+、-、x。
  • 输入输出样例(注意此样例顺序与leet中的不同,此处的顺序表达了算法的执行顺序(或称算法思路)):
    • Input: “2-1-1”
      Output: [2, 0]
      Explanation:
      (2-(1-1)) = 2
      ((2-1)-1) = 0
    • Input: “23-45”
      Output: [-34, -10, -14, -10, 10]
      Explanation:
      (2*(3-(45))) = -34
      (2
      ((3-4)5)) = -10
      ((2
      3)-(45)) = -14
      ((2
      (3-4))5) = -10
      (((2
      3)-4)*5) = 10
  • 分析思路:
    • 这个题开始困扰了很久,但从其他两个相似思路能够得到一点启示:

      • 二叉树后序遍历算法思路
      • 全排列问题中使用递归算法用到的回溯思想
    • 问题的卡点:
      • 代码中递归返回的结果为什么是vector类型,而不是int的疑问。其原因在列出样例即可明白,如在第二个样例"23-45"中,以数字2后边的进行括号划分,括号左边返回的结果只有一个数字2,而括号右边返回的结果可以两种可能,第一种可能就是(3-(45)),第二种可能是((3-4)*5),所以与“ * ”号左半部分2组合出的结果有两个,所以函数的返回值类型应为vector;并且符号的前后两部分迭代求出的结果进行组合求值(代码中的两层嵌套循环)。
    • 分析思路:本质上是分治法的思想:依次把表达式分为两部分(子问题),分别递归求解前后两部分(子问题),通过回溯的方式合并各子问题的解,得到原问题的解。
  • c++ 代码实现
#include<string>
#include<vector>
#include<iostream>
using namespace std;class Solution {public:vector<int> diffWaysToCompute(string input) {vector<int> result;int size = input.size();for (int i = 0; i < size; i++) {char cur = input[i];if (cur == '+' || cur == '-' || cur == '*') {// Split input string into two parts and solve them recursivelyvector<int> result1 = diffWaysToCompute(input.substr(0, i));vector<int> result2 = diffWaysToCompute(input.substr(i + 1));for (auto n1 : result1) {for (auto n2 : result2) {if (cur == '+')result.push_back(n1 + n2);else if (cur == '-')result.push_back(n1 - n2);elseresult.push_back(n1 * n2);}}}}// if the input string contains only numberif (result.empty())result.push_back(atoi(input.c_str()));return result;}
};int main(int argc, char* agrv[])
{Solution* solution = new Solution();string s = "2*3-4*5";vector<int> res = solution->diffWaysToCompute(s);for (auto r : res)std::cout << r << endl;system("pause");return 0;
}

leet_241_different_way_add_parenthese(给表达式加括号并求值)相关推荐

  1. 每天一道LeetCode-----对表达式添加括号并求值,返回所有可能的计算结果

    Different Ways to Add Parentheses 原题链接Different Ways to Add Parentheses 给出一个只有加,减,乘运算的表达式,要求在这个表达式中添 ...

  2. 中序表达式转其他顺序 - 表达式加括号法

    利用中序表达式加括号法来转换前序后序 操作方法 对于中序表达式转成前序或后序有一个通用的方法,那就是将表达式先括号化(能加括号的都加括号),然后针对不同的场景用不同的方法,如下图与文字描述: 中序转前 ...

  3. Java 计算数学表达式(字符串解析求值工具)

    Java字符串转换成算术表达式计算并输出结果,通过这个工具可以直接对字符串形式的算术表达式进行运算,并且使用非常简单. 这个工具中包含两个类 Calculator 和 ArithHelper Calc ...

  4. C/C++ 语言中表达式的求值

    作者:裘宗燕    北京大学数学学院信息科学系    本文基本内容发表于<编程高手>杂志 2004 年第 12 期 经常可以在一些讨论组里看到下面的提问:"谁知道下面 C 语句给 ...

  5. C/C++ 语言中的表达式求值

    转载地址:http://www.cnblogs.com/heyonggang/p/3340301.html 在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到 ...

  6. 裘宗燕:C/C++ 语言中的表达式求值

    裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:"谁知道下面C语句给n赋什么值?" m = 1; n = m+++m++; 最近有位不相识的朋友发em ...

  7. c语言中缀表达式求值_[源码和文档分享]基于C++的表达式计算求值

    一.使用说明 1.1 项目简介 表达式求值是程序设计语言编译中的一个最基本的问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的整数表达式,并利用 ...

  8. C++基础知识:C++语言中的表达式求值

    经常可以在一些讨论组里看到下面的提问:"谁知道下面C语句给n赋什么值?" m = 1; n = m+++m++; 最近有位不相识的朋友发email给我,问为什么在某个C++系统里, ...

  9. 表达式求值问题数据结构课程设计

    完整代码在最后~~ 1 需求分析 1.1 问题描述 表达式求值是程序设计语言编译中的一个最基本问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的 ...

最新文章

  1. LeetCode实战:合并两个有序数组
  2. kvo实现原理_KVC、KVO实现原理
  3. java 读取网络图片_每日一学:如何读取网络图片
  4. 数据结构之插入排序:直接插入排序
  5. 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
  6. 我的天哪!字节跳动是这样做 Code Review 的
  7. 内核线程、轻量级进程、用户线程三种线程概念解惑(线程≠轻量级进程)
  8. eclipse 如何查看Java源码
  9. word2007如何批量删除文本框
  10. Prometheus监控docker容器
  11. docker mysql lost connection to mysql server at waiting for
  12. 【深度学习原理第1篇】前馈神经网络,感知机,BP神经网络
  13. 安徽工贸职业技术学院计算机比赛,放飞青春,不负韶华!《追梦》——安徽工贸职业技术学院2019年宣传片...
  14. EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式
  15. MPP(大规模并行处理)简介
  16. SVG奥林匹克五环动画
  17. CS61A Lab 1
  18. 读书百客:《点绛唇·燕雁无心》鉴赏
  19. Linux驱动之 字符设备 ioctl接口使用
  20. 「SCOI 2018 D2T1」Pipi 酱的日常

热门文章

  1. 1-2 四轴飞行器基本原理
  2. SWFObject: 基于Javascript的Flash媒体版本检测与嵌入模块
  3. hive安装 初始化报错Error: Duplicate key name ‘PCS_STATS_IDX‘ (state=42000,code=1061)
  4. 纯粹主义的开源:每一颗螺丝钉都是自由的
  5. 窝囊少爷 第二章 冰火两重天
  6. Go GIF 动画
  7. 【IoT】产品设计之品牌、LOGO和VI是什么?
  8. TYVJ 1288 飘飘乎居士取能量块
  9. 动态分析股票走势算法图,股票趋势预测算法
  10. C# .net GridView编辑行数据