给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。

示例 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

采用了分治的思想和方法。

分治法就是将一个大规模的问题分成n个小规模的问题。

这些问题相互独立(小问题之间如何解决不会相互影响),且小问题的问题性质与大问题的性质相同。

通过小问题的解,得出大问题的解。

该问题可以将长的字符串分成短的字符串,以运算符为分界,将字符串一分为二,以只含单个整数的字符作为分界的终点。

因为运算符不止一个,所以若干(1,2,3...)个运算符顺序确定的情况下,剩下的运算符会有多解的情况。

  class Solution {
public:
vector<int> diffWaysToCompute(string input)
{
vector<int> res;
for (int i = 0; i < input.size(); i++)
{
if (input[i] == '+' || input[i] == '-' || input[i] == '*')
{
vector<int> left = diffWaysToCompute(input.substr(0, i));
vector<int> right = diffWaysToCompute(input.substr(i + 1));
for (int a : left)
{
for (int b : right)
{
switch (input[i])
{
case '+':
res.push_back(a + b);
break;
case '-':
res.push_back(a - b);
break;
default:
res.push_back(a * b);
break;
}
}
}
}
}
/*if (input.size() == 1)
res.push_back((int)(input[0] - '0'));*/
if (res.empty())
{
res.push_back(atoi(input.c_str()));
}
return res;
}
};

附:

string sub = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾;

string sub = s.substr(5, 3); //从下标为5开始截取长度为3位;
const char *c_str();
c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同.
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
int atoi(const char* str)

参数str是要转换的字符串,返回值是转换后的整数。

最新文章

  1. 一个python的邮件发送脚本,自动,定时,可以附件发送,抄送,附有说明文件
  2. MAC &amp;&amp; Linux terminal session clone
  3. [AJAX系列]onreadystatechange事件
  4. LeetCode 刷题顺序表
  5. 注册Github
  6. 问题解决——在STL的queue中使用自定义类
  7. zstu-3769 数回文子串
  8. E2PROM的尺寸
  9. 【转】C++ 单例模式
  10. JVM学习总结五(番外)——VisualVM
  11. MyBatis笔记——初次环境配置
  12. C#调用WinAPI及窗口过程
  13. Debian 7设备nginx周围环境、编译并安装和启动
  14. 玩转Ecs服务器之搭建Ftp
  15. Jenkins持续集成演示
  16. Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序
  17. 洛谷 P3380 【【模板】二逼平衡树(树套树)】
  18. jQuery判断复选框checkbox的选中状态
  19. python中文画图显示乱码解决办法
  20. vue深入了解组件——组件注册

热门文章

  1. squid+stunnel搭建代理服务器
  2. C# 简单的往txt中写日志,调试时很有用
  3. 利用MySqlBulkLoader生成csv文件,批量添加数据
  4. NetCore2.2使用Nlog自定义日志写入路径配置方式
  5. final和abstract关键字的作用
  6. Linux批量解压缩脚本
  7. MapReduce分区数据倾斜
  8. Kotlin Download
  9. lazyload懒加载和swiper轮播懒加载的用法
  10. (转)当android调试遇到ADB server didn&#39;t ACK以及顽固的sjk_daemon进程 .